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


100

在C#中,type的类实例变量的默认值是int?什么?

例如,在下面的代码中,MyNullableInt如果从未显式分配该值,它将具有什么值?

class MyClass
{
    public int? MyNullableInt;
}

(答案似乎几乎可以肯定是null0,但是到底是哪个?)


9
为什么要下票?(在没有实际运行代码来测试行为的情况下,这个问题的答案最初对我来说并不明显;而且令人惊讶的是,我在StackOverflow上找不到该问题的副本,也无法通过Google在其他地方轻易找到。)
Jon Schneider

1
您可能已经看过这里 -第一个Google为我打中。
500-内部服务器错误

2
@ 500-我在研究时确实找到了该文章-实际上我在下面的答案中链接了该文章-但据我所知,该文章未明确声明可为空的类型实例的默认值一片空白。它的确说“ HasValue的默认值为false。Value属性没有默认值”,但这不会直接回答我的原始问题,而无需进行额外的挖掘。
乔恩·施耐德

2
我想知道是否是因为您可以设置一个断点并查看值是什么,还是在“即时窗口”类型中int? x;查看结果是什么?
Rufus L

Answers:


135

int?-以及使用“类型?”的任何可空类型的默认值。声明-是null

为什么会这样:

  • int?是类型为Nullable <T>(其中T是int)的语法糖。(参考
  • Nullable<T>类型具有一个bool HasValue成员,当false该成员具有时,将使Nullable<T>实例“像”一样成为null值。特别是,将with 与实际值进行比较时,将 覆盖Nullable <T> .Equals方法以返回。trueNullable<T>HasValue == falsenull
  • 根据C#语言规范11.3.4,结构实例的初始默认值是将所有该结构的值类型字段设置为其默认值,并将所有该结构的引用类型字段设置为null
  • boolC#中变量的默认值为falsereference)。因此,HasValue默认Nullable<T>实例的属性为false;。这反过来又使该Nullable<T>实例本身表现为null

当我从改变一个声明int? x = null;int? x;,我得到的编译器错误代码进一步下跌:“使用未分配的局部变量x的”。
约翰·皮克

1
@JohnPick这是C#编译器的功能,旨在防止您在使用变量之前“忘记”初始化变量而引起的错误。您遇到未初始化的int的情况?是当它是一个类成员变量时。:都在这里的例子blogs.msdn.microsoft.com/abhinaba/2005/11/08/...
乔恩·施耐德

所以基本上这个地方是您的技术博客?您提出只需要运行代码以获取答案的问题,然后在同一分钟内自己回答问题。
GOTO

4
@JonSchneider不够公平,我不好再
GOTO

VS的编译器提示/警告具有误导性:Field 'id' is never assigned to, and will always have its default value 0。是不是很奇怪
亨迪·爱侣湾

30

共享这种Nullable<T>.GetValueOrDefault()方法非常重要,这在使用Nullable<int>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());

命令行显示上面的工作代码


0
var x = default (int?);
Console.WriteLine("x == {0}", (x == null) ? "null" : x.ToString());
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.