C# 为什么可以';t我使用linq';s Cast与用户定义的强制转换一起使用,但我可以将其与Select调用一起使用?
最近,我在使用linq方法的同时使用it用户定义的强制转换(强制转换操作符重载)时遇到了一个问题 我在SO找到了一个关于我的问题的答案,我也找到了一个很好的解释。我的问题解决了 但有件事让我想: 这不起作用的原因:C# 为什么可以';t我使用linq';s Cast与用户定义的强制转换一起使用,但我可以将其与Select调用一起使用?,c#,linq,casting,C#,Linq,Casting,最近,我在使用linq方法的同时使用it用户定义的强制转换(强制转换操作符重载)时遇到了一个问题 我在SO找到了一个关于我的问题的答案,我也找到了一个很好的解释。我的问题解决了 但有件事让我想: 这不起作用的原因: foolist.Cast<bar>(); // throws InvalidCastException 我相信这与每个方法的实现有关。如果是这样的话,Cast方法就不能有一个类似的实现来允许它与用户定义的Cast一起使用(因为这在某种程度上是意料之中的) 注意:我不是问
foolist.Cast<bar>(); // throws InvalidCastException
我相信这与每个方法的实现有关。如果是这样的话,Cast方法就不能有一个类似的实现来允许它与用户定义的Cast一起使用(因为这在某种程度上是意料之中的)
注意:我不是问它为什么失败。我在问为什么Cast方法以失败的方式编写。原因是
Cast
方法在一般上下文中执行Cast
IEnumerable<T> Cast<T>(this IEnumerable e) {
foreach (object cur in e) {
return (T)cur;
}
}
IEnumerable强制转换(此IEnumerable e){
foreach(对象cur in e){
返回(T)cur;
}
}
实际的转换逻辑在这个精确的点被验证和发出。这一点在泛型函数中,不知道用户定义的转换,因为类型T
最终被实例化为。它只能访问标准的CLR样式转换
在第二个示例中,您正在对实类型(不是泛型类型参数)执行强制转换。因此,C#编译器可以访问该对象上所有用户定义的转换,并可以插入最合适的转换 这与您链接的问题完全相同-您的问题与您列出的问题相比有什么新内容?@ReedCopsey我理解Cast方法失败的原因。我不明白为什么它是这样实现的(因为我可以很容易地解决它)。版主能看到我添加的注释并检查它是否重复吗。链接的问题(我在我的问题中也链接了我自己)解释了原因,但没有解释为什么是这样。你链接的答案解释了为什么是这样。不能键入
e
(this IEnumerable e
)?@虽然可以键入,但没有帮助。铸造现场仍将处理类型参数
IEnumerable<T> Cast<T>(this IEnumerable e) {
foreach (object cur in e) {
return (T)cur;
}
}