【发布时间】:2013-03-01 14:04:41
【问题描述】:
我正在实现一个不可变字典的特殊情况,为方便起见,它实现了IEnumerable<KeyValuePair<Foo, Bar>>。通常会修改字典的操作应该返回一个新实例。
到目前为止一切顺利。但是当我尝试为该类编写一个流利风格的单元测试时,我发现我尝试过的两个流利断言库(Should 和Fluent Assertions)都不支持对实现 @ 的对象的NotBeSameAs() 操作987654327@ -- 除非您先将它们转换为 Object,否则不会。
当我第一次遇到此问题时,我认为这只是框架中的一个漏洞,但当我看到 Fluent Assertions 有相同的漏洞时,我认为(因为我是一个相对较新的人到 C#)我可能会遗漏一些关于 C# 集合的概念——当我提交问题时,我应该 implied as much 的作者。
显然还有其他方法可以测试这一点——转换为Object 并使用NotBeSameAs(),只需使用Object.ReferenceEquals,无论如何——但如果有充分的理由不这样做,我想知道那是什么是。
【问题讨论】:
-
你看过 MS 不可变集合吗,顺便说一句? nuget.org/packages/Microsoft.Bcl.Immutable
-
@JonSkeet 嗯。你向我们展示了多么好的一面。谢谢。
-
任何类型都是
Object,为什么需要强制转换? -
@Jodrell -- 你需要转换它,因为框架是根据扩展方法实现的,如果你不转换它,你会得到一个更具体的
IEnumerable扩展方法,它不像Object的不太具体的那个,不支持NotBeSameAs()操作。 -
@JonSkeet 看起来很棒,但许可证似乎禁止在生产代码中使用它? (另外,我最初的问题仍然存在——我很想将不可变集合用于内部实现,但我仍然希望围绕它们的更有限的包装对象来实现 IEnumerable。)
标签: c# collections equality fluent-assertions