什么是布尔?返回类型意味着什

use*_*949 11 .net c#

我看到一个方法返回bool?,有没有人知道它的含义?

Cod*_*aos 25

T?是一个C#语法快捷方式Nullable<T>.所以bool?映射到Nullable<bool>.因此,在您的情况下,它是一个结构null,或者具有bool值,或者具有值.

如果Nullable<T>null这是从一个引用类型可以为空有点不同.它基本上是一个包含底层类型和布尔标志的结构HasValue.但是运行时和C#语言都有一点魔力来假装一个Nullablewith HasValue==false真的是空的.但有时候差异仍然存在.

底层类型可隐式转换为可空类型(bool- > bool?).要从可空类型中获取基础类型,您可以显式转换((bool)myNullableBool或使用Valueproperty(myNullableBool.Value).您应该先检查null,否则,如果可以为null,则会得到异常null.


Jes*_*uez 13

在C#中,"原始"类型不能包含空值:

int blah = null;
Run Code Online (Sandbox Code Playgroud)

这会产生异常,因为'int'不能保存null值.

与double,float,bool,DateTime相同......

真的很好.使用数据库时会出现问题.在数据库中,您可以拥有可以为null的行,例如Age(即int).

你如何在一个物体上持有那一行?你的int不能保存null值,行可以为null.

出于这个原因,MS创建了一个新的结构,Nullable,你可以将一个"原始"类型(或结构)传递给该结构,使其可以为空:

Nullable<int> blah = null;
Run Code Online (Sandbox Code Playgroud)

现在,这不会成为异常,该变量可以包含int和null.

因为Nullable太长了,MS创造了某种别名:如果你把'?' 在类型之后,它变得可以为空:

int? blah = null;
Nullable<int> blah = null;
Run Code Online (Sandbox Code Playgroud)

这两行完全相同,但第一行更容易阅读.

这样的东西:)


Rob*_*nik 5

任何后缀为(no-nonsense 1)值的类型?都使其成为可空类型:

  • int? 是一个可以为空的整数
  • bool?是可以为空的boolean,它实际上是一个三态boolean(true,falsenull) - 当你需要实现一些三态行为时想一想.
  • ...

换句话说,objecttype不支持可空定义,object?因为它是引用类型,并且可以具有值null.

真实的用法

Nullable类型最常用于数据库,因为它们可以很容易地转换为nullable int/bit/datetime/etc. 列到CLR类型.就像在这个例子中:

create table Test
(
    Id int identity not null primary key,
    Days int null,
    ExactDate datetime null,
    Selected bit null
)
Run Code Online (Sandbox Code Playgroud)

这很容易转换为POCO:

public class Test
{
    public int Id { get; set; }
    public int? Days { get; set; }
    public DateTime? ExactDate { get; set; }
    public bool? Selected { get; set; }
}
Run Code Online (Sandbox Code Playgroud)

1 no-nonsense指的是所有值类型,除了Nullable<T>它本身就是一个值类型,但是再次使它可以为空可能没有任何意义...避免这样的愚蠢...它无论如何都不会编译因为Nullable<Nullable<int>> i = null;可以解释有两种:

i.HasValue == false
i.HasValue == true && i.Value.HasValue == false