当我定义了隐式强制转换时,为什么Linq Cast <T>操作会失败?

Rya*_*saw 19 .net linq casting

我创建了两个类,其中一个类之间有隐式转换:

public class Class1
{
    public int Test1;
}

public class Class2
{
    public int Test2;

    public static implicit operator Class1(Class2 item)
    {
        return new Class1{Test1 = item.Test2};
    }
}
Run Code Online (Sandbox Code Playgroud)

当我创建一个类型的新列表并尝试将<T>转换为另一个类型时,它会因InvalidCastException而失败:

List<Class2> items = new List<Class2>{new Class2{Test2 = 9}};
foreach (Class1 item in items.Cast<Class1>())
{
    Console.WriteLine(item.Test1);
}
Run Code Online (Sandbox Code Playgroud)

但是,这可以正常工作:

foreach (Class1 item in items)
{
    Console.WriteLine(item.Test1);
}
Run Code Online (Sandbox Code Playgroud)

为什么在使用Cast <T>时没有调用隐式转换?

Rub*_*ink 8

因为,通过Reflector查看代码,Cast不会尝试采用任何隐式转换运算符(LINQ Cast代码针对所有类型的特殊情况进行了大量优化,但在这个方向上没有任何内容)(因为许多.NET语言不会).

在没有进行反思和其他事情的情况下,仿制药在任何情况下都不提供任何开箱即用的方式来考虑这些额外的东西.

编辑:通常,更复杂的设施,如隐式/显式,等式运算符等,通常不会像LINQ这样的通用设施处理.