在决定重复投票之前,请阅读全文...
我有一个实现的类型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(使用前将#替换为@)