一尘不染

可空类型和三元运算符:为什么?10:禁止使用null?[重复]

c#

我刚遇到一个奇怪的错误:

private bool GetBoolValue()
{
    //Do some logic and return true or false
}

然后,在另一种方法中,如下所示:

int? x = GetBoolValue() ? 10 : null;

很简单,如果该方法返回true,则将10分配给Nullable intx。否则,将null分配给可为 null的 int。但是,编译器抱怨:

错误1无法确定条件表达式的类型,因为int和之间没有隐式转换<null>

我疯了吗?


阅读 466

收藏
2020-05-19

共1个答案

一尘不染

编译器首先尝试评估右手表达式:

GetBoolValue() ? 10 : null

10是一个int文字(未int?),并null是,那么,null。这两者之间没有隐式转换,因此会出现错误消息。

如果将右侧表达式更改为以下表达式之一,则它将进行编译,因为int?null(#1)之间int以及和int?(#2,#3)之间存在隐式转换。

GetBoolValue() ? (int?)10 : null    // #1
GetBoolValue() ? 10 : (int?)null    // #2
GetBoolValue() ? 10 : default(int?) // #3
2020-05-19