同じ値を持つ配列二つを比較しても、等しくない。
var array1 = new int[] { 4 };
var array2 = new int[] { 4 };
// Trueが出力される(二つの配列が持つ値は等価である)
Console.WriteLine(array1[0].Equals(array2[0]));
// Falseが出力される(二つの配列は等しくない)
Console.WriteLine(array1.Equals(array2));
配列ではなく、数値型の変数で比較したら、等価である。
var int1 = 4;
var int2 = 4;
// Trueが出力される(二つの数値は等価である)
Console.WriteLine(int1.Equals(int2));
つまりクラスのようにnewしたオブジェクトは、たとえ一時的に同じ値を持っているとしても、比較したら等しくない。
var class1 = new Hoge();
var class2 = new Hoge();
// Falseが出力される(二つのクラスは等しくない)
Console.WriteLine(class1.Equals(class2));
先ほど等しくないと認定された配列やクラスも、比較先の変数をまるっと代入すれば等価になる。
array1 = array2;
// Trueが出力される(二つの配列は等価である)
Console.WriteLine(array1.Equals(array2));
class1 = class2;
// Trueが出力される(二つのクラスは等価である)
Console.WriteLine(class1.Equals(class2));
これは、array1やclass1に代入されていた値はもう見なくなり、array2やclass2の中身(参照先)を見るようになるから。
なお、文字列は、同じ値を持っていたら同一である。
文字列は参照型。したがって、「参照型は同じ値でも等しくない」とは言えず、今回の話題とはまた別の話。
var string1 = "hoge";
var string2 = "hoge";
// Trueが出力される(二つの文字列は等価である)
Console.WriteLine(string1.Equals(string2));
(以下コメントいただいた内容について、追記しました。)
Linqでシーケンスを扱うためのSequenceEqualメソッドを使用すると、配列の要素が全部同じかどうかを判定してくれる。
using System.Linq;
var array1 = new int[] { 4 };
var array2 = new int[] { 4 };
// Trueが出力される(二つの配列が持つ値は等価である)
Console.WriteLine(array1.SequenceEqual(array2));