2

我最近在使用 linq 的Cast方法时遇到了一个问题。

我在 SO 上发现了一个关于我的问题的类似问题,我还找到了一个很好地解释它的链接。我的问题解决了。

但有件事让我想知道:

为什么这不起作用:

foolist.Cast<bar>(); // throws InvalidCastException

虽然这有效:

foolist.Select(f => (bar)f).ToList(); // works fine

我相信这与每种方法的实现有关。如果是这样,Cast 方法是否不能具有与Select类似的实现,允许它与用户定义的强制转换一起使用(因为这在某种程度上是意料之中的)。

注意:我不是在问为什么它失败了。我在问为什么 Cast 方法是以失败的方式编写的。

4

1 回答 1

0

原因是该Cast方法在通用上下文中执行强制转换

IEnumerable<T> Cast<T>(this IEnumerable e) {
  foreach (object cur in e) { 
    return (T)cur;
  }
}

实际的铸造逻辑在这个确切的点被验证和发出。这一点在通用函数中,并且不知道T最终实例化到的类型的用户定义转换。它只能访问标准的 CLR 样式转换。

在第二个示例中,您正在对真实类型(不是泛型类型参数)进行强制转换。因此,C# 编译器可以访问该对象上所有用户定义的转换,并且可以插入最合适的转换。

于 2013-03-04T21:02:35.490 回答