ReferenceEquals和Nullable<T>

5

在编写单元测试时,我想使用Assert.AreSame(..)检查一个Nullable<T>类型时出现了意外的结果。然后我意识到以下代码会失败:

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

这里发生了什么事情?
另外,我如何确保我的方法返回的是我传递给模拟/存根的完全相同的实例,而不只是执行"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);

如果我在 Method(..) 中写下return "123",上述测试将会失败。我试图找到一种使用 Nullable 进行相同操作的方法。

可空类型的“Value”属性正在装箱。 - Simon Whitehead
请使用Assert.AreEqual()代替AreSame()。 - markmnl
1个回答

12

这里正在发生什么?

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

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

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

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

  

另外,我如何确保我的方法返回的是我传递给模拟/存根的完全相同的实例,而不仅仅是返回10?

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


我编辑了我的问题,让你理解我第二个问题的意思。 - Oscar Mederos

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接