我刚刚遇到了这个(编写代码来演示“问题”):
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 cann nicht bestimmt werden,weil keine implizite Konvertierung zwischen“System.Collections.Generic.List”和“System.Collections.Generic.LinkedList”erfolt。
大致翻译为:
无法确定条件运算符的类型,因为List和LinkedList之间没有隐式转换。
我明白编译器为什么会抱怨,但是嘿,来吧。它试图装傻。我可以看到这两个表达式不是同一类型,但有一个共同的祖先,而且作为奖励,左侧的类型也是一个共同的祖先。我相信编译器也能看到它。如果左侧声明为,我可以理解错误var
.
我在这里缺少什么?
Edit:
我接受詹姆斯·冈特的解释。也许只是为了说清楚。我可以很好地阅读编译器规范。我想知道为什么。为什么有人决定以这种方式编写规范?这种设计背后一定有一个原因。根据詹姆斯的说法,设计原则是“没有惊喜”。 CodeInChaos 还解释了如果编译器尝试从共同祖先推导出类型,您可能会遇到什么惊喜。
表达式 (a ? b : c) 必须解析为类型。类型将是 b 或 c 的类型。如果它们不同(并且没有从一种类型到另一种类型的隐式转换),则编译器在编译时不知道这是哪种类型。
你可能会说它应该推断出存在共同的根类型,但总有一个共同的根类型(例如对象)。
一般来说,C# 编译器不会尝试猜测您的意思。如果您想使用公共根类型,请将 b 和 c 转换为该类型。
这种逻辑贯穿于C#的设计始终,偶尔会有点烦人,但是far更多时候它会阻止你犯错误。
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)