将HasValue重写为?? 运营商

rad*_*byx 14 c# nullable

重写以下代码是否安全:

bool b = foo.bar.HasValue ? foo.bar.Value : false;
Run Code Online (Sandbox Code Playgroud)

bool b = foo.bar.Value ?? false;
Run Code Online (Sandbox Code Playgroud)

哪里bar是可空的类型bool?

Mar*_*ell 26

最容易解决的问题是

bool b = foo.bar.GetValueOrDefault();
Run Code Online (Sandbox Code Playgroud)

这实际上也比.Value省略有价值检查便宜.它将默认为default(T),这确实false在这里(它只返回基础T字段的值,根本没有任何检查).

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

var value = yourNullable.GetValueOrDefault(yourPreferredValue);
Run Code Online (Sandbox Code Playgroud)

  • 每天学些新东西。不知道我使用 `Nullable<T>` 多久了,只是不知道这些方法。 (3认同)

Pau*_*ner 13

你想要的是:

bool b = foo.bar ?? false;
Run Code Online (Sandbox Code Playgroud)

这(令人惊讶地)是安全的并且是无效合并运算符的预期用途.

?? ?? operator被称为null-coalescing运算符,用于为可空值类型和引用类型定义默认值.如果它不为null,则返回左侧操作数; 否则返回正确的操作数.

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

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

代码:

bool b = foo.bar.Value ?? false;
Run Code Online (Sandbox Code Playgroud)

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

  • 与当前标记为答案的回复一样有用,我觉得这个回复是对 OP 问题的实际答案。 (2认同)

Stu*_*art 7

不 - 这不安全.

这条线:

bool b = foo.bar.Value ?? false;
Run Code Online (Sandbox Code Playgroud)

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

而是使用

var b = foo.bar ?? false;
Run Code Online (Sandbox Code Playgroud)

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


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

bool b = foo.bar.Value ?? false
Run Code Online (Sandbox Code Playgroud)

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