Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/287.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# Nullable<;布尔>;还有布尔?_C# - Fatal编程技术网

C# Nullable<;布尔>;还有布尔?

C# Nullable<;布尔>;还有布尔?,c#,C#,当我对我的类进行反向工程时,我得到以下结果: public Nullable<bool> Correct { get; set; } public Nullable<bool> Response { get; set; } 有人能告诉我这两者有什么不同吗。我以前没有见过Nullable,我不知道为什么它不只是创建一个“bool” 注意:我把代码改成布尔了?回应Jon的评论可以将值赋值为true或false或null。在处理数据库和其他数据类型时,为数值和布尔类型指定n

当我对我的类进行反向工程时,我得到以下结果:

public Nullable<bool> Correct  { get; set; }
public Nullable<bool> Response { get; set; }
有人能告诉我这两者有什么不同吗。我以前没有见过
Nullable
,我不知道为什么它不只是创建一个“bool”

注意:我把代码改成布尔了?回应Jon的评论可以将值赋值为true或false或null。在处理数据库和其他数据类型时,为数值和布尔类型指定null的功能尤其有用,因为这些数据类型包含可能未指定值的元素。例如,数据库中的布尔字段可以存储值true或false,也可以是未定义的。”


可为空
bool
之间存在差异

public Nullable<bool> Correct { get; set; } // can assign both true/false and null
Correct = null;  //possible 
也许之前编码的人可能没有接触到
bool?
dataType

系统。可为空的
相当于
bool?

更新:
Nullable
bool?

有人能告诉我这两者有什么不同吗 我以前没有见过null,我也不知道为什么会 不仅仅是创造一个“bool”

从技术上讲,Nullable和bool?没有区别。无论你写什么,它们都会在IL中编译为Nullable。所以没有区别。它只是C#编译器语法

为什么要求系统为空

这是因为它被用作
类型
。类型需要位于
命名空间

但是bool和bool?有区别。因为bool是一种简单的值类型,不能为其赋值为null值,而您可以为bool?赋值

Nullable
表示可分配为null的
值类型
,它位于命名空间
System

此外,由于可以将其赋值为null,因此您可以检查它是否有这样的值

if(Correct.HasValue)
{
  //do some work
}

没有区别

提示:
Nullable n;//不允许

Nullable
bool?
是等价的(“?”后缀是一种语法糖)。
Nullable
表示除了典型的
bool
值:true和false, 还有第三个值:null

如果您使用不确定的值,例如在某些情况下,空值可能很有用 如果有响应,则无法判断实例是否正确 已经给出;例如,在您的案例中

  // 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; }

我怀疑你实际上编写了
public bool?Correct{get;set;}
。编译器不会自动将
bool
转换为
bool?
。您确定没有编写
bool?
而不是
bool
?我注意到Nullable需要系统名称空间,但bool?不需要。有人知道这是什么吗?如果使用其他工具对代码进行反向工程,它可能会生成
>bool?
back-这应该是对你的一个提示,没有区别-逆向工程工具无法知道你写的两个代码中的哪一个。
bool?
只是C编译器为方便你而定义的一个别名。这并不能解释OP的情况-我怀疑这是一个误诊。@Jon-现在我意识到数据库允许空值,而我的代码不允许。数据库脚本是由我们的DBA完成的,我对类进行了编码(不正确)。我仍然想知道为什么逆向工程不只是指定bool?嗯,至少现在你还可以对数据库进行健全性检查。我将代码改为使用Nullable,现在它要求我包含系统名称空间。那么它们真的是一样的吗?@Alan
Nullable
bool?
类似于
int
System.Int32
。它们只是表示同一事物的两种方式。您必须添加
系统
名称空间,因为您使用的是较长的版本,就像如果您使用
Int32
而不是
int
,则需要添加
系统
一样。您好。我刚刚因为您的答案而对您进行了投票。请注意,我现在将代码更改为布尔?我意识到这是我的错。@Alan没有区别,被称为alias。
if(Correct.HasValue)
{
  //do some work
}
  // 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; }