【问题标题】:When is a nullable not a nullable?什么时候可空不是可空的?
【发布时间】:2015-04-25 03:49:06
【问题描述】:

试图理解 GetValueOrDefault() 的默认行为。如果我有一个可为空的属性,则 GetValueOrDefault() 应该返回底层默认值或 null 的实例化值...因为实例化值 (null) 将是值,所以我们不需要获取“默认”值。

例如:

namespace Nullable_test
{
   public class AutoPropNullTest
   {
     public int? AutoValue { get; set; }
   }

   public class ManualPropNullTest
   {

      private int? i;

      public int? ManualValue
      {
        get
        {
            return i;
        }

        set
        {
            i = value;
        }
      }
   }
}

上面将使用空值进行实例化,但调用 ValueOrDefault 将返回零。

        ManualPropNullTest x = new ManualPropNullTest();

        AutoPropNullTest y = new AutoPropNullTest();

        //x & y will inspect as null

        int? q = x.ManualValue.GetValueOrDefault();

        //q will result in zero

我知道这是一个令人毛骨悚然的问题,只是试图与我认为默认应该是什么和现实是什么相协调。

谢谢

【问题讨论】:

  • ValueOrDefaultValueForTheUnderlyingType 太长,无法输入。
  • 甚至ValueOrDefaultForTheUnderlyingValueType
  • 是的,GetValueOrDefault() 将返回 0 - 你希望它做什么?请注意,您可以使用局部变量显示完全相同的效果 - 不需要这些属性...
  • “即使 HasValue 属性为 false,GetValueOrDefault 方法也会返回一个值(与引发异常的 Value 属性不同)。”
  • @user1278561:您阅读过GetValueOrDefault() 的文档吗?鉴于您在Nullable<int> 上调用它,所以它会返回一个int 类型的值,它怎么会返回null

标签: c#


【解决方案1】:

Nullable<T> 类型将值类型包装在编译器和运行时将其理解为“可空”类型的类型中,因为它可以在某些上下文中被视为可以具有空值。

但请注意,null 值表示一个值不存在,而不是某个默认值。

当您调用GetValueOrDefault() 时,您要求的是来自Nullable<T> 值的不可为空 值,或者值类型的 自己的默认值如果Nullable<T> 值实际上是“null”。

在这种情况下,您应该期待底层的默认值。这正是该方法打算返回的内容。另请注意,这实际上是一个实际的 value,因此如果分配给另一个 Nullable<T> 变量,将被视为 non-null(即该值存在) .

【讨论】:

  • null 的定义是没有值的......这就是我需要的解释。
【解决方案2】:

“默认值”是其实

默认值的类型是当前的类型参数 可空对象,默认值的值仅由 二进制零。

来自MSDN

所以要回答你的问题,无论二进制零值是什么类型参数。

【讨论】:

    【解决方案3】:

    如果 Nullable 类型的 HasValue 为 false,则 GetValueOrDefault 返回 default(T)。 (默认(int)为0)

    【讨论】:

      【解决方案4】:

      int (Int32) 的默认值为 0。int? (Nullable) 实例没有分配整数值,因此它返回默认值为 0 的 int。

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 2017-04-22
        • 2011-02-24
        • 1970-01-01
        • 2018-10-12
        • 2017-04-25
        • 1970-01-01
        • 2014-12-08
        相关资源
        最近更新 更多