【问题标题】:What is the purpose of a question mark after a type (for example: int? myVariable)?类型后面的问号有什么作用(例如:int?myVariable)?
【发布时间】:2011-02-11 01:30:24
【问题描述】:

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

但我看到了它的另一种用途,但找不到对 ? 运算符的这种用法的解释。

public int? myProperty
{
   get;
   set;
}

【问题讨论】:

    标签: c# asp.net .net types


    【解决方案1】:

    表示用 (int?) 声明的变量可以为空

    int i1=1; //ok
    int i2=null; //not ok
    
    int? i3=1; //ok
    int? i4=null; //ok
    

    【讨论】:

      【解决方案2】:

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

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

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

      他们不能接受对值的引用:如果你给他们分配null,他们会产生编译时错误,而不是reference types,后者显然可以接受。

      你为什么需要那个? 因为有时您的值类型变量可能会接收到由无法正常工作的事物返回的空引用,例如从数据库返回的缺失或未定义变量。

      我建议你阅读Microsoft Documentation,因为它很好地涵盖了这个主题。

      【讨论】:

        【解决方案3】:

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

        【讨论】:

        • 第二句话让我很困惑。你说的“不能”是什么意思?在编译器级别或应用程序上下文中。
        • @problemofficer 每个定义,value types 不能为空。如果您声明一个 int 或一个 bool(它们是值类型)而没有专门分配一个值,它们仍然会有值(分别为 0 和 false),即。它们不会为空。另一方面,未分配的reference types,例如object 或MyClass,将为null。您可能想了解值类型和引用类型之间的区别。
        【解决方案4】:

        表示有问题的值类型是nullable type

        Nullable 类型是 System.Nullable 结构的实例。一种 可空类型可以表示其正确的值范围 基础值类型,加上一个额外的空值。例如,一个 Nullable<Int32>,发音为“Nullable of Int32”,可以分配任何 值从 -2147483648 到 2147483647,或者可以分配为 null 价值。可以为 Nullable<bool> 分配值 true、false 或 空值。将 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);
              }
          }
        }
        

        【讨论】:

        • 用于结构。不要认为它实际上对类有用。
        • @MonsieurDart - 这就是为什么答案说“价值类型”
        • @AntoineDahan - 值类型没有可为空的类型,因为它们根据定义是不可为空的。例如,我认为您正在考虑 Java,其中有一个 int 类型和一个相应的 Integer 类。
        • 可空类型here的最新(2015)文档
        • 另请注意 c# 6 (VS 2015) 中的 question mark can follow an object (instance of a type)
        【解决方案5】:

        x ? "yes" : "no"
        

        ? 声明了一个 if 语句。这里:x代表布尔条件; : 之前的部分是 then 语句,之后的部分是 else 语句。

        例如,

        int?
        

        ?声明了一个可以为空的类型,意味着它之前的类型可能有一个空值。

        【讨论】:

        • 我看不出 '?' 之间有任何关系声明一个可以为空的类型和一个三元表达式。先生,否决您的答案。
        • 我不同意 Gus 的上述评论。该问题表明,三元表达式可能存在混淆。这个答案解决了这个问题。
        • 你会在哪里使用这种空值比较?在退货中似乎不允许这样做。 return value ? value : "isNull"; 告诉我 string value 不能转换为布尔值。
        • 我必须说这是一个非常复杂的答案,尤其是与这个问题上的其他人相比时.. -1
        • 问题指出这与 x 无关? “是”:“否”,但关于在类型声明后使用问号时。在我看来,这是一个非常糟糕的答案。
        【解决方案6】:

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

        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 转换为“测试”,因为它是不可为空的 值类型

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

        【讨论】:

          【解决方案7】:

          实际用法:

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

          【讨论】:

            【解决方案8】:

            它声明该类型可以为空。

            【讨论】:

              猜你喜欢
              • 1970-01-01
              • 2011-05-03
              • 1970-01-01
              • 2012-02-18
              • 2022-07-02
              • 2015-03-01
              • 2014-02-22
              • 1970-01-01
              相关资源
              最近更新 更多