c# - "bool"和 "bool?"有什么区别?

标签 c# boolean nullable

我对变量使用“bool”类型,就像我在 C++ 中习惯的那样,并且我尝试将我希望为 boolean 值的函数或属性的值放入我的变量中。但是我经常遇到结果类型是“bool?”的情况。而不是“bool”,隐式转换失败。

两者有什么区别,分别在什么时候使用?另外,我应该使用“bool”吗?作为我的变量的类型?这是最佳做法吗?

最佳答案

?类型后的符号只是 Nullable type 的快捷方式, bool?相当于Nullable<bool> .

boolvalue type , 这意味着它不能是 null ,因此 Nullable 类型基本上允许您包装值类型,并且能够分配 null给他们。

bool?可以包含三个不同的值:true , falsenull .

此外,没有为 bool? 定义的短路运算符 (&& ||)

只定义了逻辑 AND、包含 OR 运算符,它们的行为如下:

x        y      x & y   x | y   
true    true    true    true
true    false   false   true
true    null    null    true
false   true    false   true
false   false   false   false
false   null    false   null
null    true    null    true
null    false   false   null
null    null    null    null

Nullable 类型基本上是一个通用结构,具有以下公共(public)属性:

public struct Nullable<T> where T: struct
{
    public bool HasValue { get; }
    public T Value { get; }
}

HasValue属性表示当前对象是否有值,Value property 将获取对象的当前值,或者如果 HasValue 为 false,它将抛出 InvalidOperationException。

现在你一定很奇怪,Nullable是一个结构体,一个不能为null的值类型,那为什么下面的语句是有效的呢?

int? a = null;

该示例将编译为:

.locals init (valuetype [mscorlib]System.Nullable`1<int32> V_0)
IL_0000:  ldloca.s   V_0
IL_0002:  initobj    valuetype [mscorlib]System.Nullable`1<int32>

调用 initobj ,它将指定地址处值类型的每个字段初始化为空引用或适当原始类型的 0。

就是这样,这里发生的是默认的struct initialization .

int? a = null;

相当于:

Nullable<int> a = new Nullable<int>();

关于c# - "bool"和 "bool?"有什么区别?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/1181491/

相关文章:

c# - 单击按钮更新数据时 GridView 刷新

Java Palindrome 赋值 - boolean 值总是返回 False 值

c# - SQL CLR 函数返回可为空的 bool 值

typescript - 我怎么能在 typescript 中返回一个可为空的值

c# - 更改页面后 RadGrid 分页无法正常工作

c# - 如何正确替换字符串

c# - 检查 boolean 数组中的元素值 - C#

c# - 可空变量在内存分配中的优势 C#

c# - 如何在 WebAPI 中返回 404 和 403 的 json?

objective-c - 已声明但未设置的变量评估为真?