c#:从可空类型赋值

c#:从可空类型赋值,c#,nullable,C#,Nullable,如果我有一个可为空的“decimal?d”,并且我想将d赋值给不可为空的e,那么正确的方法是什么 您需要确定是否可以,即可为空的d是否有值 decimal e; if (d.HasValue) { e = d.Value; } if (d.HasValue) { e = d.Value; } else { /* now what */ } 另一个有趣的情况很常见,您希望使用三元函数分配给一个可为null的函数,在这种情况下,您必须强制转换以使两个分支具有相同的类型 d = foo

如果我有一个可为空的“decimal?d”,并且我想将d赋值给不可为空的e,那么正确的方法是什么

您需要确定是否可以,即可为空的d是否有值

decimal e;

if (d.HasValue)
{
    e = d.Value;
}
if (d.HasValue) { e = d.Value; } else { /* now what */ }
另一个有趣的情况很常见,您希望使用三元函数分配给一个可为null的函数,在这种情况下,您必须强制转换以使两个分支具有相同的类型

d = foo ? 45 : (int?)null;
decimal e;
if(d.HasValue) 
{
    e = d.Value;
}

请注意null to(int?)的情况,以便两个分支具有相同的类型。

我通常使用以下内容:

d = foo ? 45 : (int?)null;
decimal e;
if(d.HasValue) 
{
    e = d.Value;
}
decimal e = d.HasValue ? d.Value : decimal.Zero;

这里的原因是我非常喜欢三元运算,我通常会为我正在处理的类型赋值,如果我执行了失败的
TryParse()
。对于
decimal
这将是
decimal.Zero
,对于
int
它也将是
0

当d为null时,e应该取什么值?我可以说-1表示可能的“System.invalidooperationexception”,但我不会。这个答案现在是正确的,但只有在复制了Phaedrus的答案之后。天哪,别那么易怒。我修复了无效代码。接得好,费德鲁斯。我匆忙给出了答案。从技术上讲,我没有复制答案。-1用于声明一个变量,该变量在赋值后将超出范围。这不是否决投票的理由。它回答了这个问题,如果有人不知道需要在if块外声明e,那么他们的问题比可空类型更大。(你会很快注意到他的错误,你不会很快注意到可能的System.InvalidOperationExceptions)。编辑为移动'decimal e;'声明超出范围(现在都正确了)。关于三元运算符的事情很好。总是有点烦我,我必须在这里将null转换为一个类型:-)喜欢null合并操作符。这将扩展为“十进制e=d!”无效的d:0.0;'确切地说,对我来说,这是简短的,并且允许您简洁地处理可为null的类型。您也不必担心使用.HasValue或.Value属性。回显其他注释-这是一种方法。