【发布时间】:2010-10-25 21:03:36
【问题描述】:
我刚刚遇到了一个奇怪的错误:
private bool GetBoolValue()
{
//Do some logic and return true or false
}
然后,在另一种方法中,像这样:
int? x = GetBoolValue() ? 10 : null;
很简单,如果方法返回true,给Nullableintx赋值10。否则,将 null 分配给 nullable int。但是,编译器抱怨:
错误 1 无法确定条件表达式的类型,因为
int和<null>之间没有隐式转换。
我要疯了吗?
【问题讨论】:
-
也许这会在编译器的未来版本中得到纠正,因为 'int' 和 '
' 之间确实存在隐式转换,那就是 'int?' -
想象编译器足够聪明,可以说“好的,我们没有使用第一种类型 (int),所以我们将寻找另一种可以用于此表达式结果的类型。 "如果您输入“Console.WriteLine((Predicate() ? 5.6 : null).GetType().ToString());”会得到什么?你会浮起来吗?还是双倍?还是对象?还是从浮点数隐式转换的用户定义类?编译器如何知道选择哪种类型,因为它无法选择表达式中的类型?
-
我的意思是,最重要的是,可空类型并没有什么特别之处,只是它们有一个简写“?”句法。编译器没有一个特殊的标志告诉它一个 int?是“就像一个带有一点额外内容的 int,所以尽量使用它。”
-
@bruno,@mquander,我个人更愿意在我做这样疯狂的事情时看到错误,如果我真的想要一个对象,那么我会做一个明确的演员表。编译器的当前行为很好:如果两种类型之间存在隐式转换(不是通过第三种猜测/推断类型),那么一切正常。如果没有隐式转换,则会出现错误。
-
确实,在整个 C# 中使用的微妙但重要的设计原则之一是,在根据多个备选方案决定某物的类型时,我们总是选择备选方案中最好的一个 .我们永远不会“创造”一种不在替代品中的新类型,然后选择它。我们只从您的代码中已经存在的类型中进行选择,并且只有其中一种明显优于其他类型。
标签: c# .net nullable conditional-operator