BFr*_*ree 242 .net c# nullable conditional-operator
我刚刚遇到一个奇怪的错误:
private bool GetBoolValue()
{
//Do some logic and return true or false
}
Run Code Online (Sandbox Code Playgroud)
然后,在另一种方法中,这样的事情:
int? x = GetBoolValue() ? 10 : null;
Run Code Online (Sandbox Code Playgroud)
很简单,如果方法返回true,则为Nullable int
x 赋值10 .否则,将null赋给nullable int.但是,编译器抱怨:
错误1无法确定条件表达式的类型,因为
int
和之间没有隐式转换<null>
.
我疯了吗?
Luk*_*keH 396
编译器首先尝试评估右手表达式:
GetBoolValue() ? 10 : null
Run Code Online (Sandbox Code Playgroud)
这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
Run Code Online (Sandbox Code Playgroud)
And*_*are 34
试试这个:
int? x = GetBoolValue() ? 10 : (int?)null;
Run Code Online (Sandbox Code Playgroud)
基本上发生的是条件运算符无法确定表达式的"返回类型".由于编译器隐含地决定它10
是一个int
它然后决定该表达式的返回类型也是一个int
.由于一个int
不能null
(条件运算符的第三个操作数)它抱怨.
通过转换null
为a,Nullable<int>
我们明确告诉编译器该表达式的返回类型应为a Nullable<int>
.您也可以轻松地将其10
转换int?
为具有相同效果的内容.
尝试以下方法之一:
int? x = GetBoolValue() ? (int?)10 : null;
int? x = GetBoolValue() ? 10 : (int?)null;
Run Code Online (Sandbox Code Playgroud)
问题是三元运算符是基于你的第一个参数赋值来推断类型的...在这种情况下是10,这是一个int,而不是一个可以为null的int.
你可能会有更好的运气:
int? x = GetBoolValue() (int?)10 : null;
Run Code Online (Sandbox Code Playgroud)
归档时间: |
|
查看次数: |
74439 次 |
最近记录: |