如您所料,以下代码会出现编译错误:
List<Banana> aBunchOfBananas = new List<Banana>();
Banana justOneBanana = (Banana)aBunchOfBananas;
但是,当使用 IEnumerable<Banana>
时,您只会收到运行时错误。
IEnumerable<Banana> aBunchOfBananas = new List<Banana>();
Banana justOneBanana = (Banana)aBunchOfBananas;
为什么 C# 编译器允许这样做?
最佳答案
我想这是因为 IEnumerable<T>
是一个接口(interface),其中某些实现可以 显式转换为 Banana
- 不管那会多么愚蠢。
另一方面,编译器知道 List<T>
无法显式转换为 Banana
.
顺便说一下,示例的选择不错!
添加一个例子来阐明。也许我们有一些“可枚举”应该总是最多一个Banana
:
public class SingleItemList<T>:Banana, IEnumerable<T> where T:Banana {
public static explicit operator T(SingleItemList<T> enumerable) {
return enumerable.SingleOrDefault();
}
// Others omitted...
}
然后你可以实际这样做:
IEnumerable<Banana> aBunchOfBananas = new SingleItemList<Banana>();
Banana justOneBanana = (Banana)aBunchOfBananas;
因为它与编写以下内容相同,编译器非常满意:
Banana justOneBanana = aBunchOfBananas.SingleOrDefault();
关于c# - 为什么 C# 编译器允许在 IEnumerable<T> 和 TAlmostAnything 之间进行显式转换?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/9198024/