Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/linq/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 为什么可以';t我使用linq';s Cast与用户定义的强制转换一起使用,但我可以将其与Select调用一起使用?_C#_Linq_Casting - Fatal编程技术网

C# 为什么可以';t我使用linq';s Cast与用户定义的强制转换一起使用,但我可以将其与Select调用一起使用?

C# 为什么可以';t我使用linq';s Cast与用户定义的强制转换一起使用,但我可以将其与Select调用一起使用?,c#,linq,casting,C#,Linq,Casting,最近,我在使用linq方法的同时使用it用户定义的强制转换(强制转换操作符重载)时遇到了一个问题 我在SO找到了一个关于我的问题的答案,我也找到了一个很好的解释。我的问题解决了 但有件事让我想: 这不起作用的原因: foolist.Cast<bar>(); // throws InvalidCastException 我相信这与每个方法的实现有关。如果是这样的话,Cast方法就不能有一个类似的实现来允许它与用户定义的Cast一起使用(因为这在某种程度上是意料之中的) 注意:我不是问

最近,我在使用linq方法的同时使用it用户定义的强制转换(强制转换操作符重载)时遇到了一个问题

我在SO找到了一个关于我的问题的答案,我也找到了一个很好的解释。我的问题解决了

但有件事让我想:

这不起作用的原因:

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;
  }
}