【问题标题】:Is there any difference between type? and Nullable<type>?类型之间有什么区别吗?和 Nullable<type>?
【发布时间】:2008-09-11 13:25:20
【问题描述】:

在 C# 中,可为空的原始类型(即bool?)只是它们对应的Nullable&lt;T&gt; 类型的别名,还是两者之间有区别?

【问题讨论】:

  • 应该编辑这个问题以澄清原始类型的名称是“bool?”而不是“布尔”。下面有很好的答案,但问题不清楚。
  • 我有一个关于int?Nullable&lt;int&gt; 的类似问题,发现这个问题(及其答案)非常有帮助。

标签: c# .net nullable


【解决方案1】:

如果您使用 Ildasm 查看 IL,您会发现它们都编译为 Nullable&lt;bool&gt;

【讨论】:

  • 也许他们不知道 IL 或 ILDasm 是什么意思。链接它们?
  • 虽然这是正确的,但在语言的某些极端情况下,当两者之间存在 差异时。有关详细信息,请参阅this answer(以及那里的链接问题)。
【解决方案2】:

bool? b = nullNullable&lt;bool&gt; b = null 之间没有区别。 ? 只是 C# 编译器语法糖。

【讨论】:

    【解决方案3】:

    要访问布尔值?您需要执行以下操作:

    bool? myValue = true;
    bool hasValue = false;
    
    if (myValue.HasValue && myValue.Value)
    {
      hasValue = true;
    }
    

    请注意,您不能只做:

    if (myValue)
    {
      hasValue = true;
    }
    

    【讨论】:

    • 嗯,不确定是否要对此进行投票,因为它没有回答问题,但它仍然有用且简洁! ;-)
    • 好吧,根据乔尔的说法,如果你觉得它有用,你应该投票 - 如果它是答案,则不一定。但是我会这么说;)
    • +1,但我会使用不同的名称以便于阅读!
    • 如果更喜欢做 'if(myValue == true)' 代替。它的工作方式相同,因为如果 myValue 为 null,它将为 false。
    【解决方案4】:

    我很惊讶还没有人去寻找源代码(C# 规范)。从 §4.1.10 可空类型:

    可空类型写成 T?,其中 T 是基础类型。该语法是 System.Nullable 的简写,两种形式可以互换使用。

    所以,不,这两种形式没有任何区别。 (假设在您使用的任何命名空间中都没有任何其他名为 Nullable&lt;T&gt; 的类型。)

    【讨论】:

      【解决方案5】:

      Nullable&lt;T&gt; 是一个结构,由一个 T 和一个指示 T 是否有效的位标志组成。 Nullable&lt;bool&gt; 具有三个可能的值:true、false 和 null。

      编辑:啊,我错过了这样一个事实,即“bool”后面的问号实际上是类型名称的一部分,而不是您提出问题的指示:)。那么,您的问题的答案是“是的,C# bool? 只是 Nullable&lt;bool&gt; 的别名”。

      【讨论】:

      • 这没有回答问题。
      • 是的,我在看到您的回答后意识到这一点。谢谢!
      【解决方案6】:

      bool 是一种值类型,因此它不能包含 NULL 值。如果您使用Nullable&lt;&gt; 包装任何值类型,它将赋予它这种能力。此外,通过附加属性HasValueValue 更改值的访问方法。

      但问题是:Nullable&lt;bool&gt;bool? 是别名。

      【讨论】:

      • 尽管这条评论来自很久以前,但他们可能觉得这个答案与其他答案重复,所以他们 DV'd?
      • 显然我不是西部最快的枪。所有热门答案都在几分钟内。
      【解决方案7】:

      不,没有区别。总结:

      System.Boolean -> 有效值:真​​、假

      bool -> System.Boolean 的别名

      Nullable -> 有效值:真​​、假、空

      布尔? -> Nullable

      的别名

      希望这会有所帮助。

      【讨论】:

        【解决方案8】:

        Null 原语只是封装在 Nullable 中的常规原语。任何相反的表现都只是编译器和语法糖。

        【讨论】:

          【解决方案9】:

          没有区别。看这里:http://msdn.microsoft.com/en-us/library/1t3y8s4s.aspx

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

          【讨论】:

            猜你喜欢
            • 2015-07-17
            • 2011-03-24
            • 1970-01-01
            • 1970-01-01
            • 2015-10-04
            • 2014-03-09
            • 2015-02-22
            • 2013-09-13
            相关资源
            最近更新 更多