c# - 为什么在泛型方法中不调用显式运算符

标签 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();
    }
}

最佳答案

因为通用方法有一组 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/

相关文章:

c# - 使用 Moles 在另一个进程中 Hook 方法

c# - 通用委托(delegate)线程

java可转换枚举

delphi - 我的OO泛型设计错误。我该如何解决?

java - 返回一个列表,我已经有一个rowmapper实现

c# - 如何创建一个在 WPF 中拖动时调整窗口大小的按钮?

c# - 使用 LinQ 每季度过滤数据

c# - AutoMapper.Mapper.CreateMap<TSource,TDestination>()' 已过时

c# - 如果可以在源代码控制提交、 check out 、差异等之前和之后自动格式化代码,公司真的需要标准代码风格吗?

kotlin - 如果在 Kotlin 中泛型是 Int,泛型如何工作?