【发布时间】:2011-05-24 09:06:26
【问题描述】:
我刚遇到这个(编代码来演示“问题”):
public ICollection<string> CreateCollection(int x)
{
ICollection<string> collection = x == 0
? new List<string>()
: new LinkedList<string>();
return collection;
}
编译器抱怨:
Fehler CS0173: Der Typ des bedingten Ausdrucks kann nicht bestimmt werden, weil keine implizite Konvertierung zwischen "System.Collections.Generic.List" und "System.Collections.Generic.LinkedList" erfolgt。
大致翻译为:
无法确定条件运算符的类型,因为List和LinkedList之间没有隐式转换。
我知道为什么编译器会抱怨,但是,来吧。它试图装傻。我可以看到两个表达式的类型不同,但有一个共同的祖先,作为奖励,左侧的类型也是一个共同的祖先。我相信编译器也可以看到它。如果左侧声明为var,我可以理解错误。
我在这里错过了什么?
编辑:
我接受 James Gaunt 的解释。也许只是为了说清楚。我可以很好地阅读编译器规范。我想知道为什么。为什么有人决定以这种方式编写规范。这种设计背后一定有原因。根据詹姆斯的设计原则是“没有惊喜”。 CodeInChaos 还解释了如果编译器尝试从共同祖先推断类型,您可能会遇到什么意外。
【问题讨论】:
-
尝试在其中一个条件结果上将显式强制转换为
ICollection<string>。 -
我知道如何规避它,我只是想了解它。
-
如果...编译器会创建一个匿名类型,该类型将 (A) 实现所有公共接口 (B) 充当所选对象的包装器?
-
@m0sa 这行不通,因为突然结果指向了另一个实例。
-
一台机器向你抱怨。我很确定你比那台机器聪明,你知道该怎么做。语言规范中的规则同样是机械的,它阻止你将枪对准你的脚并扣动扳机。它不会炸掉你的脚,它会炸掉你的脸。
标签: c# .net compiler-construction