我看到一个方法返回bool?
,有人知道它的含义吗?
答案 0 :(得分:25)
T?
是Nullable<T>
的C#语法快捷方式。因此bool?
映射到Nullable<bool>
。所以在你的情况下,它是一个null
或bool
值的结构。
如果Nullable<T>
为null
,则与引用类型为空有点不同。它基本上是一个包含底层类型和布尔标志HasValue
的结构。但是运行时和C#语言都有点神奇,假装Nullable
HasValue==false
真的是空的。但有时候差异仍然存在。
底层类型可隐式转换为可空类型(bool
- &gt; bool?
)。要从可空类型中获取基础类型,您可以显式转换((bool)myNullableBool
或使用Value
属性(myNullableBool.Value
)。但是,您之前应该检查null
,如果可空值为null
,您将获得异常。
答案 1 :(得分:12)
在C#中,“原始”类型不能包含空值:
int blah = null;
这会产生异常,因为'int'不能保存空值。
与double,float,bool,DateTime相同......
真的很好。使用数据库时会出现问题。在数据库中,您可以拥有可以为null的行,例如Age(即int)。
如何在对象上保留该行?你的int不能保存null值,行可以为null。
由于这个原因,MS创建了一个新的结构,Nullable,你可以将一个“原始”类型(或结构)传递给该结构,使其成为可空的,如:
Nullable<int> blah = null;
现在,这个变量可以保存一个int和一个null。
因为Nullable太长了,MS创建了某种别名:如果你把'?'在类型之后,它变得可以为空:
int? blah = null;
Nullable<int> blah = null;
这两行完全相同,但第一行更容易阅读。
类似的东西:)
答案 2 :(得分:5)
以?
为后缀的任何(非废话 1 )值类型使其成为可以为空的类型:
int?
是一个可以为空的整数bool?
是可以为空的布尔值,它实际上是三态布尔(true
,false
和null
) - 想想它你需要实现一些三重状态行为。换句话说,object
类型不支持可空定义为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
)
这很容易转换为POCO:
public class Test
{
public int Id { get; set; }
public int? Days { get; set; }
public DateTime? ExactDate { get; set; }
public bool? Selected { get; set; }
}
1 no-nonsense 是指除
Nullable<T>
之外的所有值类型,它本身就是一个值类型,但它在制作时没有任何意义它可以再次为空......避免这样的愚蠢...无论如何它都不会编译,因为Nullable<Nullable<int>> i = null;
可以用两种方式解释:•
i.HasValue == false
•i.HasValue == true && i.Value.HasValue == false