ImmutableDictionaries的比较

时间:2014-06-04 09:36:19

标签: c# immutability

来自System.Collections.Immutable

ImmutableDictionary在此代码段中表现不尽如人意:

var idict = new Dictionary<string, int> { { "a", 1 }, { "b", 2 } }.ToImmutableDictionary();
var idict2 = new Dictionary<string, int>() { { "a", 1 }, { "b", 2 } }.ToImmutableDictionary();
var idict3 = new Dictionary<string, int>() { { "b", 2 }, { "a", 1 } }.ToImmutableDictionary();
var idict4 = new Dictionary<string, int>() { { "a", 2 }, { "b", 1 } }.ToImmutableDictionary();

Console.WriteLine("true?: " + (idict == idict2).ToString());
Console.WriteLine("true?: " + (idict == idict3).ToString());
Console.WriteLine("false?: " + (idict == idict4).ToString());

结果是:

true?: False
true?: False
false?: False

为什么?为什么我不能treat these objects as values - 如果他们是,你知道,不可变吗?

1 个答案:

答案 0 :(得分:0)

C#编程指南中有一个专门针对此问题的页面:Guidelines for Overriding Equals() and Operator ==。重要的是:

  

默认情况下,运算符==测试引用相等性   确定两个引用是否表示相同的对象。   因此,引用类型不必实现operator == in   为了获得这个功能。当一个类型是不可变的,即   实例中包含的数据无法更改,   重载operator ==来比较值的相等而不是引用   平等可能很有用,因为它们可以作为不可变对象   只要它们具有相同的值,它们就被认为是相同的。它不是   好主意在非不可变类型中覆盖operator ==。

因此,语言惯例似乎鼓励为了这个目的而覆盖==

但是,相对较新的类Tuple的行为方式与ImmutableDictionary相同。关于此问题有一个StackOverflow discussion

我还没有找到任何技术上的原因,为什么没有实现它,所以我想这是因为.NET程序员不习惯结构平等。 (当然,这是为什么不这样做的完全正当理由。)