C# - 基本问题:什么是'?'?

时间:2010-04-23 14:34:16

标签: c# .net nullable

我想知道?在C#中的含义是什么? 我看到的内容有:DateTime?int?。我想这是特定于C#4.0的? 我不能在谷歌找它,因为我不知道这个东西的名字 问题是我正在使用DateTime而且我有很多演员错误(从DateTimeDateTime?)。

谢谢

7 个答案:

答案 0 :(得分:34)

这是撰写Nullable<int>Nullable<DateTime>的简写。 Nullablesvalue types一起使用,不能为空(它们总是有值)。

顺便说一下,它并不特定于C#4。

如果int?有值,您只能将int分配给int? n = 1; int i = n ?? default(int); //or whatever makes sense ,因此您的代码必须执行以下操作:

Nullable

另请注意,HasValue有两个属性Value和{{1}},如果已设置值,则可以使用test并获取实际值。

答案 1 :(得分:12)

这意味着它是nullable type

它允许您为值类型(如int和DateTime)分配空值。它对数据库中的可选字段等非常有帮助。

答案 2 :(得分:5)

它指定nullable types

  

我认为这是C#特有的C#   4.0

自2.0以来一直在C#中

答案 3 :(得分:5)

?是可以为空的值类型。

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

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;

可以将可空类型与null进行比较,因此以上是:

的简写
if( myval != null ) {
    nonNullable = myval.Value;
} else {
    nonNullable = DefaultValue;
}

但我更喜欢??

答案 4 :(得分:1)

需要注意:[编辑:显然这有时只会发生]

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

答案 5 :(得分:1)

它是声明泛型类Nullable<T>的实现的简写方式,其中T是不可为空的值类型。

所以

int? i = null;

相同
Nullable<int> i = null;

如上所述,Nullable<T>公开了HasValue属性,因此您可以在处理之前检查i是否具有值。

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

答案 6 :(得分:1)

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

?也用在条件运算符中。

int max = x > y ? x : y

这相当于:

int max;
if( x > y )
{
  max = x;
}
else
{
  max = y;
}