首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >将HasValue重写为??运算符

将HasValue重写为??运算符
EN

Stack Overflow用户
提问于 2011-06-24 19:15:48
回答 8查看 4.9K关注 0票数 15

重写以下代码是否安全:

代码语言:javascript
运行
复制
bool b = foo.bar.HasValue ? foo.bar.Value : false;

代码语言:javascript
运行
复制
bool b = foo.bar.Value ?? false;

其中,bar是可以为空的类型bool?

EN

回答 8

Stack Overflow用户

回答已采纳

发布于 2011-06-24 19:22:07

最简单的修复方法是

代码语言:javascript
运行
复制
bool b = foo.bar.GetValueOrDefault();

这实际上也比.Value更便宜,因为它省略了has-value检查。它将默认为default(T),在这里它实际上是false (它只返回底层T字段的值,而不进行任何检查)。

如果您需要不同于default(T)的默认值,则:

代码语言:javascript
运行
复制
var value = yourNullable.GetValueOrDefault(yourPreferredValue);
票数 27
EN

Stack Overflow用户

发布于 2011-06-24 19:20:51

你想要的是:

代码语言:javascript
运行
复制
bool b = foo.bar ?? false;

这(令人惊讶地)是安全的,并且是null-coalescing运算符的预期用途。

The ??运算符称为空合并运算符,用于定义、可为空值类型、以及引用类型的默认值。如果左操作数不为空,则返回左操作数;否则返回右操作数。

来源:http://msdn.microsoft.com/en-us/library/ms173224.aspx

Nullable<T>的情况下,它在功能上等同于Nullable.GetValueOrDefault(T defaultValue)

代码:

代码语言:javascript
运行
复制
bool b = foo.bar.Value ?? false;

将导致编译器错误,因为您不能将运算符应用于值类型,并且Nullable<T>.Value总是返回值类型(或者在没有值时抛出异常)。

票数 16
EN

Stack Overflow用户

发布于 2011-06-24 19:19:01

不-这不安全。

这行代码:

代码语言:javascript
运行
复制
bool b = foo.bar.Value ?? false;

如果foo.bar没有值,将抛出InvalidOperationException。

相反,请使用

代码语言:javascript
运行
复制
var b = foo.bar ?? false;

更新-我刚从其他答案中了解到.GetValueOrDefault(); -这看起来是一个很好的建议!

更新2 -@ProgrammingHero的答案也是正确的(增加了+1!)-这行:

代码语言:javascript
运行
复制
bool b = foo.bar.Value ?? false

实际上不会编译-因为Error 50 Operator '??' cannot be applied to operands of type 'bool' and 'bool'

票数 8
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/6466967

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档