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

时间:2010-04-22 12:52:37

标签: c# asp.net .net types

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

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

public int? myProperty
{
   get;
   set;
}

9 个答案:

答案 0 :(得分:399)

这意味着有问题的值类型为nullable type

  

Nullable类型是System.Nullable结构的实例。一个   可空类型可以表示其正确的值范围   基础值类型,加上一个额外的空值。例如,a   Nullable<Int32>,发音为“Nullable of Int32”,可以任意分配   值从-2147483648到2147483647,或者可以赋值为null   值。可以为Nullable<bool>赋值true,false或   空值。将null赋给数字和布尔类型的能力是   在处理数据库和其他数据时尤其有用   包含可能未赋值的元素的类型。对于   例如,数据库中的布尔字段可以存储值true或   是的,或者可能是未定义的。

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);
      }
  }
}

答案 1 :(得分:110)

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

答案 2 :(得分:56)

x ? "yes" : "no"

声明 if 句子。这里: x 表示布尔条件; 之前的部分是然后句子,之后的部分是 else 句子。

例如,

int?

声明可以为空的类型,并且意味着它之前的类型可能具有空值。

答案 3 :(得分:47)

  

Nullable Types

     

Nullable类型是。的实例   System.Nullable结构。 可以为空   type可以代表正常范围   其基础价值类型的值,   加上额外的空值。对于   例如,a [Nullable<Int32>],发音   可以分配“Intul的Int32”   任何值从-2147483648到   2147483647,或者可以分配它   空值。一个[Nullable<bool>]可以   分配值true或false,或   空值。赋值为null的能力   数字和布尔类型是   处理时特别有用   数据库和其他数据类型   包含可能不是的元素   分配了一个值。例如,a   数据库中的布尔字段可以存储   值true或false,或者可能是   未定义。

答案 4 :(得分:11)

它声明该类型可以为空。

答案 5 :(得分:6)

实际用法:

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

  return someFunctionThatHandlesIntAndReturnsString(value);
}

答案 6 :(得分: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转换为&#39;测试&#39;因为它是不可空的   值类型

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

答案 7 :(得分:2)

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

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

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

它们不能接受对值的引用:如果为它们分配一个null,而不是reference types,则显然会接受,因此会产生编译时错误。

您为什么需要那个? 因为有时您的值类型变量可能会接收到某些情况下返回的空引用,而这种引用不能很好地工作,例如从数据库返回的丢失或未定义的变量。

我建议您阅读Microsoft Documentation,因为它涵盖了该主题。

答案 8 :(得分:0)

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

int i1=1; //ok
int i2=null; //not ok

int? i3=1; //ok
int? i4=null; //ok