2012-08-07 5 views
20

C#言語仕様バージョン4の1.6.7.5演算子はList<T>演算子に関する情報です:==および!=です。しかし、私はList<T>で定義されたそのような演算子を見つけることができませんか?何か不足していますか? 1.6.7.5オペレータからリスト<T>演算子== C#言語仕様バージョン4

サンプルコード:

List<int> a = new List<int>(); 
a.Add(1); 
a.Add(2); 
List<int> b = new List<int>(); 
b.Add(1); 
b.Add(2); 
Console.WriteLine(a == b); // Outputs "True" => here I get False as well 
b.Add(3); 
Console.WriteLine(a == b); // Outputs "False" 
+0

より明確に – darnir

+5

あなたの質問を教えてくださいすることは、「私はそれをしたいと思います..」のための「出力」を言わないでください:) –

+8

をこのコードは一緒に、コピーされ、言語仕様からそのまま貼り付けられ@pstコメント。 – dasblinkenlight

答えて

17

スペックは間違いなく正しいですが、混乱します。この仕様では、List(名前の厳しい選択肢)というクラスが定義されています。

次の表は、リストと呼ばれる一般的なクラスを示しています。リストは、オブジェクトの拡張可能なリストを実装しています。クラスには、最も一般的な種類の関数メンバーのいくつかの例が含まれています。

このクラスは、1.6.7節の仕様で見ることができます。 Equals演算子はオーバーロードされており、上で説明した出力と一致します。おそらく、より良い名前がそのクラスに選ばれたはずです。

static bool Equals(List<T> a, List<T> b) { 
    if (a == null) return b == null; 
    if (b == null || a.count != b.count) return false; 
    for (int i = 0; i < a.count; i++) { 
     if (!object.Equals(a.items[i], b.items[i])) { 
      return false; 
     } 
    } 
    return true; 
} 
21

List<T>operator==に過負荷をかけない参照タイプです。したがって、デフォルトの参照等価セマンティクスが使用されます。価値セマンティクスを提供するためにoperator==を上書きするという印象を受けているようですが、そうではありません。 abの両方が同じList<T>インスタンスを参照する場合、abに等しくなります。

編集:私は仕様を見ました。

Listクラスは、operator ==とoperator!=の2つの演算子を宣言し、これらの演算子をListインスタンスに適用する式に新しい意味を与えます。特に、演算子は、2つのListインスタンスの等価性を、Equalsメソッドを使用して含まれる各オブジェクトと比較することで定義します。次の例では、==演算子を使用して2つのListインスタンスを比較します。

正直なところ...私は彼らが何を話しているのか分からないが、これは正しいとは思わない。私がいくつかのテストを実行した後でわかる限り、List<T>クラスは参照の平等性を使用します。良い質問。

EDIT2:逆コンパイルList<T>operator==および/またはoperator!=オーバーロード。この場合、仕様は完全に間違っているように見えます。

+1

言語仕様には、「List クラスはoperator ==とoperator!=の2つの演算子が宣言されているため、これらの演算子をListインスタンスに適用する式に新しい意味が与えられます。それぞれのequalsメソッドを使って含まれているオブジェクトのそれぞれを比較しています。 – dasblinkenlight

+0

@dasblinkenlight:そうです、今読んでいます。それを理解しようとしています... –

+0

@DanielDusek:はい、私はちょうど私のポストにそれを追加しました。それは間違っているようです。現実は仕様に沿わない。 –

関連する問題