重写以下代码是否安全:
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)
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始终返回值类型(或在没有值时抛出异常).
不 - 这不安全.
这条线:
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'