为什么在通用方法中不调用显式运算符

Joh*_*aft 4 c# generics

我把这个问题提炼成了我能想到的最简单的代码示例.为什么不从泛型方法调用显式运算符?

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)

Mar*_*ell 9

因为泛型方法有组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)