我把这个问题提炼成了我能想到的最简单的代码示例.为什么不从泛型方法调用显式运算符?
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();
}
}
Run Code Online (Sandbox Code Playgroud)
因为泛型方法有一组IL,基于TResult.它不会对每个呼叫者执行不同的IL.通用TResult 没有任何运算符.
另外:这里的运算符需要介于object和之间TResult,并且您无法定义涉及的运算符object.
例如:Cast<int>和Cast<string>与Cast<Guid>所有具有完全相同的IL.
你可以欺骗dynamic:
return (TResult)(dynamic)o;
Run Code Online (Sandbox Code Playgroud)
| 归档时间: |
|
| 查看次数: |
149 次 |
| 最近记录: |