C# “可为空类型”的默认值是什么;int?“;(包括问号)?

C# “可为空类型”的默认值是什么;int?“;(包括问号)?,c#,integer,nullable,C#,Integer,Nullable,在C#中,类型为int?的类实例变量的默认值是多少 例如,在下面的代码中,MyNullableInt如果从未显式赋值,将具有什么值 class MyClass { public int? MyNullableInt; } (答案似乎几乎肯定是null或0,但这是哪一个?对于int?——以及使用“type?”声明的任何可为null的类型,null 原因是: int?是类型的语法糖(其中T是int),结构。() Nullable类型有一个成员,当false时,该成员使Nullable实例

在C#中,类型为
int?
的类实例变量的默认值是多少

例如,在下面的代码中,
MyNullableInt
如果从未显式赋值,将具有什么值

class MyClass
{
    public int? MyNullableInt;
}

(答案似乎几乎肯定是
null
0
,但这是哪一个?

对于
int?
——以及使用“type?”声明的任何可为null的类型,
null

原因是:

  • int?
    是类型的语法糖(其中T是
    int
    ),结构。()
  • Nullable
    类型有一个成员,当
    false
    时,该成员使
    Nullable
    实例“像”一个
    null
    值。特别是,当将具有
    HasValue==false的
    null
    值与实际的
    null
    值进行比较时,将重写以返回
    true
  • 从中,结构实例的初始默认值是将该结构的所有值类型字段设置为其默认值,并将该结构的所有引用类型字段设置为
    null
  • C#中
    bool
    变量的默认值为
    false
    ()。因此,默认的
    null
    实例的
    HasValue
    属性是
    false
    ;这反过来又使得
    可空
    实例本身的行为类似于

我觉得分享
Nullable.GetValueOrDefault()
方法很重要,在处理使用
Nullable
aka
int?
值的数学计算时,该方法特别方便。很多时候,您不必检查HasValue属性,只需使用
GetValueOrDefault()

var defaultValueOfNullableInt = default(int?);
Console.WriteLine("defaultValueOfNullableInt == {0}", (defaultValueOfNullableInt == null) ? "null" : defaultValueOfNullableInt.ToString());

var defaultValueOfInt = default(int);
Console.WriteLine("defaultValueOfInt == {0}", defaultValueOfInt);

Console.WriteLine("defaultValueOfNullableInt.GetValueOrDefault == {0}", defaultValueOfNullableInt.GetValueOrDefault());

为什么要投否决票?(在没有实际运行代码来测试行为之前,这个问题的答案对我来说并不明显;令人惊讶的是,我在StackOverflow上找不到这个问题的副本,也无法通过Google在别处轻松找到。)你本可以先看一看——google为我找到的。@500——我在研究时确实找到了那篇文章——我在下面的回答中确实链接到了它——但据我所知,这篇文章没有明确说明可空类型实例的默认值为空。它确实说“HasValue的默认值为false。value属性没有默认值”,但这并不能直接回答我的原始问题,而不进行额外的挖掘。我想知道这是否是因为您可以设置一个断点并查看值是什么,或者是在即时窗口类型
int中?x并查看结果是什么?当我从
int更改声明时?x=零
int?x,我在下面的代码中得到了编译器错误:“使用未分配的局部变量x”。@JohnPick这是一个C#编译器功能,旨在防止因您在使用变量之前“忘记”初始化变量而产生的错误。您可能遇到未初始化的int的情况?当它是类成员变量时。这两个例子:那么这个地方基本上就是你的科技博客?您提出的问题只需要运行代码就可以得到答案,然后在同一分钟内自己回答问题。@JonSchneider很公平,我的坏thenVS编译器提示/警告具有误导性:
字段“id”从未分配给,并且始终具有其默认值0
。很奇怪,不是吗?
var defaultValueOfNullableInt = default(int?);
Console.WriteLine("defaultValueOfNullableInt == {0}", (defaultValueOfNullableInt == null) ? "null" : defaultValueOfNullableInt.ToString());

var defaultValueOfInt = default(int);
Console.WriteLine("defaultValueOfInt == {0}", defaultValueOfInt);

Console.WriteLine("defaultValueOfNullableInt.GetValueOrDefault == {0}", defaultValueOfNullableInt.GetValueOrDefault());