为什么 Linq Cast<> 帮助器不能与隐式转换运算符一起使用?

2024-04-19

在决定重复投票之前,请阅读全文...

我有一个实现的类型implicit cast运算符转换为另一种类型:

class A
{
    private B b;
    public static implicit operator B(A a) { return a.b; }
}
class B
{
}

现在,隐式和显式转换工作得很好:

B b = a;
B b2 = (B)a;

...那么为什么 Linq 的.Cast<>没有吗?

A[] aa = new A[]{...};
var bb = aa.Cast<B>();  //throws InvalidCastException

查看源代码.Cast<>,并没有什么神奇之处:如果参数确实是一个,则有一些特殊情况IEnumerable<B>, 进而:

foreach (object obj in source) 
    yield return (T)obj; 
    //            ^^ this looks quite similar to the above B b2 = (B)a;

那么为什么my明确的演员工作,但不是里面的演员.Cast<>?

编译器会美化我的显式强制转换吗?

附言。我看见这个问题 https://stackoverflow.com/q/808725/11545但我认为它的答案并不能真正解释正在发生的事情。


那么为什么我的显式强制转换有效,而 .Cast 内的强制转换却无效?

你的明确演员知道在编译时源类型和目标类型是什么。编译器可以发现显式转换,并发出代码来调用它。

That isn't泛型类型的情况。请注意,这并不特定于Cast或者一般的 LINQ - 如果你尝试一个简单的方法,你会看到同样的事情Convert method:

public static TTarget Convert<TSource, TTarget>(TSource value)
{
    return (TTarget) value;
}

那将not调用任何用户定义的转换 - 甚至来自(比如说)的转换int to long。它会only执行引用转换和装箱/拆箱转换。这只是泛型工作原理的一部分。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

为什么 Linq Cast<> 帮助器不能与隐式转换运算符一起使用? 的相关文章

随机推荐