【问题标题】:Variable type ending with ?以 ? 结尾的变量类型
【发布时间】:2011-02-21 06:43:39
【问题描述】:

? 是什么意思:

public bool? Verbose { get; set; }

应用于string?时,出现错误:

类型“string”必须是不可为空的值类型才能在泛型类型或方法“System.Nullable”中用作参数“T”

【问题讨论】:

  • 只是附加到描述可空类型的其他答案 - bool 作为 0 或 1 存储在内存中,没有其他选择。通过使其成为可空类型分配更大的内存区域,其值可以为真、假或空。您会注意到您现在可以执行 Verbose.HasValue 之类的操作,如果将其定义为布尔值,您将无法执行此操作。
  • 另外添加到一般对话中,所有引用类型默认情况下都可以为空(IE 你可以将它们全部设置为空),所以 Nullable 类型被设计为不接受它们,因为它会重复功能并使事情复杂化。

标签: c# .net types nullable


【解决方案1】:

? 表示你的值类型可以有一个空值,特别是在数据库的情况下

处理您需要这些可空对象来检查某个值是否为空。

它只能应用于值类型,因为引用类型可以为空。

【讨论】:

    【解决方案2】:

    ? 使您的不可为空(值)类型可以为空。它不适用于string,因为它是引用类型,因此默认情况下可以为空。

    来自MSDN,关于值类型:

    与引用类型不同,值类型 不能包含空值。 但是,可空类型功能 确实允许值类型 分配给 null。

    ? 基本上是Nullable<T> structure 的简写。

    如果你想了解更多,MSDN 有一个关于这个话题的great article

    【讨论】:

      【解决方案3】:

      ? 是以下结构的简写:

      struct Nullable<T>
      {
          public bool HasValue;
          public T Value;
      }
      

      您可以直接使用此结构,但? 是使生成的代码更简洁的快捷语法。而不是输入:

      Nullable<int> x = new Nullable<int>(125);
      

      相反,你可以写:

      int? x = 125;
      

      这不适用于字符串,因为字符串是引用类型而不是值类型。

      【讨论】:

        【解决方案4】:

        只有值类型可以声明为 Nullable。引用类型默认可以为空。所以你不能创建可以为空的字符串,因为字符串是一个引用类型。

        【讨论】:

          【解决方案5】:

          那个?运算符表示该属性实际上是一个可为空的类型。

          public bool? Verbose { get; set; } 
          

          等价于

          public Nullable<bool> Verbose { get; set; }
          

          可空类型是 c# 2.0 中引入的一种特殊类型,它接受值类型作为通用参数类型并允许将空值分配给该类型。

          可空类型只接受值类型作为泛型参数,这就是为什么当你尝试使用 ?运算符与字符串类型结合使用。

          欲了解更多信息:MSDN Nullable Types

          【讨论】:

            【解决方案6】:

            bool?Nullable&lt;bool&gt; 的简写符号。一般来说,the documentation 表示:

            语法 T?是简写 可空,其中 T 是值类型。 这两种形式可以互换

            由于string 不是value type(它是reference type),因此您不能将其用作Nullable&lt;T&gt; 的通用参数。

            【讨论】:

              【解决方案7】:

              bool?System.Nullable&lt;bool&gt; 的缩写形式。类型参数只接受值类型,而不接受引用类型(例如字符串)。

              【讨论】:

                猜你喜欢
                • 2016-10-23
                • 2014-05-09
                • 2019-11-26
                • 1970-01-01
                • 2019-03-11
                • 1970-01-01
                • 2020-03-28
                • 1970-01-01
                • 1970-01-01
                相关资源
                最近更新 更多