关于.net:C# – 基本问题:什么是’?’?

C# - Basic question: What is '?'?

本问题已经有最佳答案,请猛点这里访问。

我想知道在C中,?是什么意思?我看到的是:DateTime?int?。我想这是C 4.0特有的?我不能在谷歌里找到它,因为我不知道它的名字。问题是我使用的是datetime,我有很多强制转换错误(从DateTimeDateTime?)。

谢谢你


这是写NullableNullable的简写。nullables用于不能为空的值类型(它们总是有一个值)。

顺便说一下,这并不是针对C 4的。

如果int有值,则只能将int?分配给它,因此您的代码必须执行以下操作:

1
2
int? n = 1;
int i = n ?? default(int); //or whatever makes sense

还要注意,Nullable有两个属性,HasValueValue,如果设置了值,可以使用test来获取实际值。


这意味着它是一个可以为空的类型。

它允许您为值类型(如int和datetime)分配一个空值。它对数据库中的可选字段非常有用。


?是可以为空的值类型。

可以使用??运算符将其与值类型混合:

1
2
3
4
5
6
7
const int DefaultValue = -1;

// get a result that may be an integer, or may be null
int? myval = GetOptionalIdFromDB();

// the value after ?? is used if myval is null
int nonNullable = myval ?? DefaultValue;

可以将可以为空的类型与空进行比较,因此上面是以下内容的简写:

1
2
3
4
5
if( myval != null ) {
    nonNullable = myval.Value;
} else {
    nonNullable = DefaultValue;
}

但我更喜欢??


它指定可以为空的类型。

I suppose this is C# specific to C#
4.0?

自2.0年以来一直在C中


正如其他人所说,在类型的名称之后,它意味着可以为空的类型。

?也用于条件运算符。

1
int max = x > y ? x : y

这相当于:

1
2
3
4
5
6
7
8
9
int max;
if( x > y )
{
  max = x;
}
else
{
  max = y;
}

它是声明泛型类Nullable实现的一种简略方法,其中t是不可为空的值类型。

所以

1
int? i = null;

是一样的

1
Nullable<int> i = null;

如上所述,Nullable公开hasValue属性,以便在处理之前检查i是否具有值。

有趣的是:如果您将Nullable i = 3;强制转换为一个对象,那么您可以将它强制转换回int或Nullable,因为它在装箱前有一个值。但是,如果将Nullable i = null;强制转换为对象,则在强制转换回int时会得到nullreferenceexception,但可以强制转换回Nullable


要注意的一点:【编辑:显然这只是有时发生的】

1
2
3
4
5
// nullable type properties may not initialize as null
private int? foo; // foo = 0

// to be certain, tell them to be null
private int? foo = null;