类型后面的问号的目的是什么(例如:int?myVariable)?


433

通常,问号的主要用途是用于条件x ? "yes" : "no"

但是我看到了它的另一种用法,但是找不到?例如该运算符的用法说明。

public int? myProperty
{
   get;
   set;
}

Answers:


437

这意味着所讨论的值类型是空的类型

可空类型是System.Nullable结构的实例。可为空的类型可以表示其基础值类型的正确值范围,以及一个附加的空值。例如,可以为 Nullable<Int32>发音为“ Int32的Nullable”分配从-2147483648到2147483647之间的任何值,也可以为其分配空值。Nullable<bool>可以为A 分配值true,false或null。在处理包含可能未分配值的元素的数据库和其他数据类型时,为数字和布尔类型分配null的功能特别有用。例如,数据库中的布尔值字段可以存储值true或false,也可以未定义。

class NullableExample
{
  static void Main()
  {
      int? num = null;

      // Is the HasValue property true?
      if (num.HasValue)
      {
          System.Console.WriteLine("num = " + num.Value);
      }
      else
      {
          System.Console.WriteLine("num = Null");
      }

      // y is set to zero
      int y = num.GetValueOrDefault();

      // num.Value throws an InvalidOperationException if num.HasValue is false
      try
      {
          y = num.Value;
      }
      catch (System.InvalidOperationException e)
      {
          System.Console.WriteLine(e.Message);
      }
  }
}

3
用于结构。不要认为它实际上对类有用。
MonsieurDart

8
@MonsieurDart-那就是为什么答案说“值类型”的原因
肖恩

3
@AntoineDahan-值类型不具有可为空的类型,因为根据定义它们是不可为空的。我认为您正在考虑Java ,例如,其中有一个int类型和一个对应的Integer类。
肖恩

2
近期(2015年)的文档可空类型在这里
恐龙

2
还要注意,问号可以跟随 c#6(VS 2015)中的一个对象(一种类型的实例
Zim,

118

这是的简写Nullable<int>Nullable<T>用于允许将值类型设置为null。值类型通常不能为null


3
再加一个使用速记一词的方法,很简单吧!
哈里2014年

3
第二句话使我感到困惑。“不能”是什么意思?在编译器级别或在应用程序上下文中。
问题人员

5
每个定义的@问题官员,value types不能为null。如果您声明int或bool(值类型)而没有专门分配值,则它们仍将具有值(分别为0和false),即。他们不会为空。reference types另一方面,未分配的(例如object或MyClass)将为null。您可能想了解值类型和引用类型之间的区别。
克劳斯·比斯科夫·佩德森

谢谢你的解释。我现在知道了。

62

x ? "yes" : "no"

声明一个if语句。此处:x表示布尔条件;之前的部分就是那么一句和后一部分是别的句子。

例如,

int?

声明可为null的类型,并表示它之前的类型可以具有null值。


9
我看不到“?”之间的任何关系。声明可为null的类型和三元表达式。先生,请回答你的答案。
Gus Crawford'3

36
我不同意古斯的上述评论。问题表明三元表达式可能存在混淆。这个答案解决了这个问题。
Mario Levesque 2015年

您将在哪里使用这种空值比较?在退货内似乎是不允许的。return value ? value : "isNull";告诉我string value不可转换为布尔值。
C4d

我必须说这是一个非常复杂的答案,特别是与该问题的其他人相比
。.-

这应该是公认的答案。由于它是清晰而精确的。+1
JP Dolocanog '17

49

可空类型

可空类型是System.Nullable结构的实例。可为空的类型可以表示其基础值类型的正常值范围,以及一个附加的null值。例如,可以为[ Nullable<Int32>](发音为“ Int32的Nullable”)分配从-2147483648至2147483647的任何值,也可以为其分配空值。Nullable<bool>可以为[ ]分配值true或false或null。当处理包含可能未分配值的元素的数据库和其他数据类型时,为数字和布尔类型分配null的功能特别有用。例如,数据库中的布尔值字段可以存储值true或false,也可以未定义。



6

实际用法:

public string someFunctionThatMayBeCalledWithNullAndReturnsString(int? value)
{
  if (value == null)
  {
    return "bad value";
  }

  return someFunctionThatHandlesIntAndReturnsString(value);
}

1
在OP仍处于活动状态时,提出问题5年后,答案可能不再适用。
草莓2015年

10
对我来说是3个小时前:-)
AJBauer

3

为了补充上面的答案,这是一个代码示例

struct Test
{
    int something;
}
struct NullableTest
{
    int something;
}
class Example
{
    public void Demo()
    {
        Test t = new Test();
        t = null;

        NullableTest? t2 = new NullableTest();
        t2 = null;
    }
}

这将导致编译错误:

错误12无法将null转换为'Test',因为它是不可为空的值类型

请注意,NullableTest没有编译错误。(注意t2声明中的?)


2

int?是的简写Nullable<int>。两种形式可以互换。

Nullable<T>是一个运算符,可以与值类型T一起使用以使其接受null

如果你不知道它:值类型是接受值类型intboolchar等...

它们不能接受对值的引用:如果将它们赋给a null,则它们会生成一个编译时错误,而不是显然可以接受它的引用类型

你为什么需要那个?因为有时您的值类型变量可能会接收到某些操作不正常的返回的空引用,例如从数据库返回的丢失或未定义的变量。

我建议您阅读Microsoft文档,因为它很好地涵盖了该主题。

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.