C#.net不能在内联if语句中将null赋值给变量。

5
我只是想知道为什么以下代码不起作用(请记住我将age设置为可为空):
myEmployee.age = conditionMet ? someNumber : null;

然而,以下内容可以正常工作:

if(conditionMet)
{
    myEmployee.age = someNumber;
}
else
{
    myEmployee.age = null;
}

为什么我不能在条件运算符中将值设置为null??我的代码中所有的if语句看起来不太好。

谢谢。


3
请定义“代码无法正常工作”。 - jrummell
1
请注意 - 这不是“内联if”;它是条件运算符if语句是语句(即没有值);条件运算符?:是表达式(因此您遇到了这个问题,因为类型必须相同或隐式可转换)。 - Andras Zoltan
抱歉,我在搜索时使用了错误的关键词,并没有意识到这个问题已经被问过了。 - PaulG
4个回答

19

两边的类型必须相同(或可以进行隐式转换):

myEmployee.age = conditionMet ? someNumber : (int?)null;

根据文档

首先,first_expression和second_expression的类型必须相同;如果类型不同,则需要存在一种隐式转换。


在这种情况下,三元运算符的true-exprfalse-expr规则也发挥了作用。+1 - user7116
你为什么选择追踪 null 而不是将其转换为 (int?)someNumber?你认为这样更易读吗?我问这个问题是因为你和 RedFilter 都选择了相同的方法。 - Marc
两种方式都可以 - 就个人而言,我发现这种方式更容易阅读,但这只是个人偏好。 - BrokenGlass
@Marc:我会选择int,因为逻辑上可将其转换为可空整数,但null无法逻辑上转换为整数。 - user7116

8

你可以这样做,只需明确指出应将null解释为哪种类型:

myEmployee.age = conditionMet ? someNumber : (int?)null; 

2
看看文档上说了什么:
引用: [MSDN] 可空类型变量的默认值将HasValue设置为false。 值未定义。
因此,默认值为null。 这意味着您可以简单地执行:
if (conditionMet)
    myEmployee.age = someNumber;

“没有必要使用更加晦涩的代码语法。”
如果需要,您可以提前使用null进行初始化,如果它不是默认值,就像这样:
myEmployee.age = null;

if (conditionMet)
    myEmployee.age = someNumber;

0
三元语句的各部分类型必须可以隐式转换为一个公共基础类型。在 intnull 的情况下,它们不能这样做。您可以通过将 age 设置为 Nullable<int>(或 int?)并将 someNumber 转换为 int? 来解决此问题。
编辑以澄清:您可以使用适当的转换将值设置为 null 的三元语句。这里的问题不是您尝试使用三元语句将值设置为 null。而是涉及到三元语句中涉及的两个表达式的编译器推断返回类型无法隐式转换为公共基础类型。

你漏掉了问题的最后一行,我想。 - Tamara Wijsman

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接