c# - 为什么 C# 编译器允许在 IEnumerable<T> 和 TAlmostAnything 之间进行显式转换?

标签 c# .net generics compiler-errors

如您所料,以下代码会出现编译错误:

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/

相关文章:

c# - 如何在 C# 中自动转换变量?

java - 如果有多种可能性,我应该分配什么类型?

c# - 如何从ActiveX或DLL调用Javascript函数

.net - VB.NET迭代器函数丢失局部变量

c# - 在 C# 中为 XML 文档创建父节点

c# - 强制子类实现私有(private)方法

java - 返回作为方法参数给出的类型列表?

ios - 在 Swift 中将 nil 分配给泛型可选值

c# - 生成1到6的随机数,停在最后一个

c# - 使用 Html Helper 在页面末尾插入脚本