我已将这个问题提炼为我能想到的最简单的代码示例。为什么不从泛型方法中调用显式运算符?
class Program
{
static void Main(string[] args)
{
A a = new A();
B b = (B)a; // works as expected
b = Cast<B>(a);
}
static TResult Cast<TResult>(object o)
{
return (TResult)o; // throws Invalid Cast Exception
}
}
class A
{
}
class B
{
public static explicit operator B(A a)
{
return new B();
}
}
最佳答案
因为通用方法有一组 IL,基于TResult
.它不会为每个调用者执行不同的 IL。和通用 TResult
没有任何运算符。
此外:此处的运算符需要介于 object
之间和 TResult
,并且您无法定义涉及 object
的运算符.
例如:Cast<int>
和 Cast<string>
和 Cast<Guid>
都有完全相同的 IL。
你可以用dynamic
作弊:
return (TResult)(dynamic)o;
关于c# - 为什么在泛型方法中不调用显式运算符,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/14246211/