我刚刚发现了一个奇怪的错误:
private bool GetBoolValue()
{
//Do some logic and return true or false
}
然后,在另一种方法中,像这样:
int? x = GetBoolValue() ? 10 : null;
很简单,如果方法返回true,将10赋值给Nullableint x。否则,将null赋值给nullable int。然而,编译器抱怨:
错误1无法确定条件表达式的类型,因为int和<null>之间没有隐式转换。
我是不是疯了?
编译器首先尝试求右边表达式的值:
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
编译器首先尝试求右边表达式的值:
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