我正在尝试实习一些传递的对象值保存在内存中很长一段时间。其中一些对象是可空值类型。我无法正确地实习Nullable值,我认为可能发生某种我不理解的“有用”自动装箱。这是我应该通过的单元测试(假设Nullalbes的行为类似于对象),但不是:

[Test]
public void InternNullableType()
{
    DateTime? one = new DateTime(2010, 2, 3, 4, 5, 6, DateTimeKind.Utc);
    DateTime? two = new DateTime(2010, 2, 3, 4, 5, 6, DateTimeKind.Utc);

    // should be equal, but not reference equal
    Assert.False(ReferenceEquals(one, two));
    Assert.True(one.Equals(two));

    // create an interning dictionary
    Dictionary<DateTime?, DateTime?> intern = new Dictionary<DateTime?, DateTime?>();
    intern[one] = one; // add 'one', this will be the value we hand out
    two = intern[two]; // intern the value of two

    // values should be equal, and reference qual
    Assert.True(one.Equals(two));

    // this fails when it passes for objects
    Assert.True(ReferenceEquals(one, two));
}


这里发生了什么?

最佳答案

可空类型是结构,它们不是对象。它们是可以分配为null的特殊结构。因此,实习将无法像处理字符串那样工作,因为string是引用类型。

当您检索可为空的对象的值时,装箱的值将被取消装箱,并使用该值创建新的可为空的实例。这就是ReferenceEquals返回false的原因。

docs


  装箱可空类型时,公共语言运行库会自动装箱Nullable对象的基础值,而不是Nullable<T>对象本身。也就是说,如果HasValue属性为true,则将Value属性的内容装箱。当可空类型的基础值取消装箱时,公共语言运行库将创建一个新的Nullable<T>结构,该结构初始化为基础值。

关于c# - 无法实习为可空的DateTime,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/51956478/

10-10 18:12