C#: 可空类型的赋值

4
如果我有一个可空的 "decimal? d",并且我想将d赋值给非空的e,正确的方法是什么?
5个回答

16
decimal e = d ?? 0.0;

喜欢空合并运算符。这会扩展为“decimal e = d!= null?d:0.0;”。 - Matt Mitchell
对我来说,这个方法简洁明了,让你能够简洁地处理可空类型。你也不必担心使用 .HasValue 或 .Value 属性。 - Ralph Caraveo
回应其他评论 - 这是正确的做法。 - user1921

10
decimal e;
if(d.HasValue) 
{
    e = d.Value;
}

1
在分配值后将超出作用域的变量进行声明为-1。 - Mike Cole
1
这不是一个downvote的理由。它回答了问题,如果有人不知道e需要在if块外声明,那么他们面临的问题比Nullable类型更大。 - BFree
你会很快注意到他的错误,但不会像那样快地注意到可能出现的 System.InvalidOperationExceptions。 - Matt Mitchell
1
已编辑以将“decimal e;”声明移至作用域之外(现在全部正确)。 - Matt Mitchell

2

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

if (d.HasValue) { e = d.Value; } else { /* now what */ }

还有一个常见的有趣案例,涉及到使用三元运算符给可空类型赋值时,你需要进行强制类型转换,以使两个分支具有相同的类型。

d = foo ? 45 : (int?)null;

注意将 null 转换为 (int?),以使两个分支具有相同的类型。

关于三元运算符的问题,你说得很好。我总是有点烦恼,必须在这里将 null 强制转换为一种类型 :-) - Matt Mitchell

1
decimal e;

if (d.HasValue)
{
    e = d.Value;
}

1
当d为空时,e应该取什么值? - Sebastian Good
2
我可以为可能的“System.InvalidOperationException”返回-1,但我不会这样做。 - Phaedrus
1
这个答案现在是正确的,但只是在复制Phaedrus的答案之后。 - Matt Mitchell
1
别这么暴躁,Graphain。我已经修复了我的无效代码。Phaedrus,你发现得真好。我匆忙回答了。 - Mike Cole
技术上说,我没有复制答案。 - Mike Cole

1

我通常会选择这样的方式:

decimal e = d.HasValue ? d.Value : decimal.Zero;

这里的原因是我喜欢三元操作符,并且通常会为我正在处理的类型分配一个值,即使TryParse()失败。对于decimal,它将是decimal.Zero,对于int,它也将是0

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