首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >ReferenceEquals和Nullable<T>

ReferenceEquals和Nullable<T>
EN

Stack Overflow用户
提问于 2013-11-20 04:56:57
回答 1查看 224关注 0票数 5

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

代码语言:javascript
复制
int? k = 10;
Assert.IsTrue(ReferenceEquals(k, k));

这是怎么回事?

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

编辑:

我通常做以下工作,以确保在单元测试中获得一致的结果:

代码语言:javascript
复制
//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做同样的事。

EN

回答 1

Stack Overflow用户

发布于 2013-11-20 05:00:15

这里发生了什么事?

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

假设您的代码实际上如下:

代码语言:javascript
复制
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)也会失败。

票数 12
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/20087704

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档