Nullable<bool>和bool有什么区别?

4
当我反向工程我的类时,我得到以下内容:
public Nullable<bool> Correct  { get; set; }
public Nullable<bool> Response { get; set; }

I coded:

public bool? Correct  { get; set; }
public bool? Response { get; set; }

有人能告诉我这两者之间是否有任何区别吗?我以前没有见过Nullable<bool>,不确定为什么它不直接创建一个"bool"。

注意:根据Jon的评论,我已经将我的代码更改为bool?。


1
我怀疑你实际上编写了 public bool? Correct { get; set; }。编译器不会自动将 bool 转换为 bool? - Jon Skeet
你确定你没有写成 bool? 而是 bool 吗? - Robert Rouhani
我注意到 Nullable<bool> 需要 System 命名空间,但 bool? 不需要。有人知道这是为什么吗? - Alan2
如果您使用不同的工具来反向工程化代码,它可能会生成 bool? - 这应该是一个提示,告诉您没有区别 - 反向工程工具无法知道您写了哪个。 - Damien_The_Unbeliever
bool? 只是 C# 编译器为了方便而定义的别名。 - CodesInChaos
现在这只是一个关于https://dev59.com/0nVD5IYBdhLWcg3wL4mM?rq=1的问题。 - Jon Skeet
5个回答

5
有人能告诉我这两者之间有什么区别吗?我之前没有见过 Nullable,不确定为什么它不能只创建一个“bool”。
从技术上讲,在 Nullable 和 bool? 之间没有任何区别。无论你写什么,它们都会编译成 IL 中的 Nullable,所以没有区别。问号只是 C# 编译器语法。
为什么需要 System 才能使用 Nullable?
因为它被用作一种类型。类型需要在命名空间中。
但是 bool 和 bool? 是有区别的。bool 是一个简单的值类型,不能分配 null 值,而你可以给 bool? 分配值。
Nullable 表示一个可以被赋予 null 的值类型,位于命名空间 System 中。
此外,由于它可以被赋予 null,因此你可以检查它是否有值,像这样:
if(Correct.HasValue)
{
  //do some work
}

5

"Nullable"可以赋值为true、false或null。在处理数据库和其他数据类型时,将null赋值给数字和布尔类型特别有用,因为这些类型可能包含未分配值的元素。例如,数据库中的布尔字段可以存储true或false的值,也可能未定义。

可空类型


3
这并没有解释原帖作者所遭遇的情况,我怀疑这是一种误诊。 - Jon Skeet
好的,至少现在你也可以对你的数据库进行健全性检查了。 - user2259020
我修改了我的代码,使用了Nullable<bool>,现在它要求我包含System命名空间。那么它们真的是一样的吗? - Alan2
从技术上讲,无论你写什么,它们都会编译成 IL 中的 Nullable<bool>。所以没有区别。至于为什么需要系统,那是因为它被用作一种类型。而类型需要在命名空间中。 - Ehsan
1
@Alan Nullable<bool>bool?就像intSystem.Int32一样,是表示同一事物的两种方式。您需要添加System命名空间,因为您使用了较长的版本,就像您使用Int32而不是int一样。 - Scott Chamberlain
显示剩余2条评论

2
Nullable<bool>bool? 是等价的(“?” 后缀是一种语法糖)。Nullable<bool> 表示除了典型的 bool 值:true 和 false 外,还有一个第三个值:nullhttp://msdn.microsoft.com/en-us/library/1t3y8s4s(v=vs.80).aspx http://msdn.microsoft.com/en-us/library/2cf62fcy.aspx 如果您使用不确定值,例如在某些情况下无法确定实例是否正确或是否已给出任何响应,则空值可能很有用;例如在您的情况下。
  // true  - instance is correct
  // false - instance is incorrect
  // null  - additional info required
  public bool? Correct { get; set; }
  // true  - response was given 
  // false - no response
  // null  - say, the response is in the process
  public bool? Response { get; set; }

2

是的,Nullable<bool>bool 之间有区别。

public Nullable<bool> Correct { get; set; } // can assign both true/false and null
Correct = null;  //possible 

然而

在你的情况下,你无法拥有它。

public bool Correct { get; set; } //can assign only true/false
Correct = null;  //not possible

也许之前编码的人没有接触过 bool? 数据类型。

System.Nullable<bool> 等同于 bool?

更新:Nullable<bool>bool? 没有区别


2
你好。我刚刚因为你的回答给你点了赞。请注意,我现在已经将我的代码更改为bool?我意识到这是我的错误。 - Alan2
@Alan 没有区别,也被称为别名。 - Praveen

1

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