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 - 如果他们是,你知道,不可变吗?
答案 0 :(得分:0)
C#编程指南中有一个专门针对此问题的页面:Guidelines for Overriding Equals() and Operator ==。重要的是:
默认情况下,运算符==测试引用相等性 确定两个引用是否表示相同的对象。 因此,引用类型不必实现operator == in 为了获得这个功能。当一个类型是不可变的,即 实例中包含的数据无法更改, 重载operator ==来比较值的相等而不是引用 平等可能很有用,因为它们可以作为不可变对象 只要它们具有相同的值,它们就被认为是相同的。它不是 好主意在非不可变类型中覆盖operator ==。
因此,语言惯例似乎鼓励为了这个目的而覆盖==
。
但是,相对较新的类Tuple
的行为方式与ImmutableDictionary
相同。关于此问题有一个StackOverflow discussion。
我还没有找到任何技术上的原因,为什么没有实现它,所以我想这是因为.NET程序员不习惯结构平等。 (当然,这是为什么不这样做的完全正当理由。)