ReferenceEquals和Nullable <t> </t>

时间:2013-11-20 04:56:57

标签: c# reference nullable equality

在编写单元测试时,我想对Assert.AreSame(..)类型使用Nullable<T>,我得到了意想不到的结果。然后我意识到下面的代码失败了:

int? k = 10;
Assert.IsTrue(ReferenceEquals(k, k));

这里发生了什么?

另外,我如何确保我的方法返回我传递给mock / stub的同一个实例,而不仅仅是return 10

修改

我通常会执行以下操作以确保在单元测试中获得一致的结果:

//Arrange
var result = new string(new[] {'1', '2', '3'});
mock.SetUp(x => x.Method("something").Returns(result);

//Act here

//Assert
Assert.AreSame(result, instance.ValueAssigned);

如果我在return "123"Method(..),则上述测试将失败。我试图找到一种与Nullable一样的方法。

1 个答案:

答案 0 :(得分:12)

  

这里发生了什么?

两个参数都被装箱到不同的对象。

想象一下你的代码实际上就是这样:

int? k = 10;
object x = k; // Boxing operation 1
object y = k; // Boxing operation 2
Assert.IsTrue(ReferenceEquals(x, y));

不要忘记可以为空的值类型仍然是值类型 - 因此当它们转换为引用类型表达式时它们会被装箱。

  

另外,我怎样才能确保我的方法返回我传递给mock / stub的同一个实例,而不仅仅是返回10?

对于价值类型,这个问题根本没有意义。基本上,对引用类型使用Assert.AreSame,对值类型使用Assert.AreEqual。请注意,这与可空性无关。 Assert.AreSame(10, 10)也会失败。