2011-01-28 3 views
6

私は次のことをしようとしている:T value1とT value2 = default(T)を比較できません。なぜ、どのようにC#でそれを行うには?

T value1 = el.value; // it's of type T already 
T value2 = default(T); 
if (value1 != value2) // gives the following error: Operator '!=' cannot be applied to operands of type 'T' and 'T' 
{ 
    // ... 
} 

だから、どのように私は両方の値を比較することができますか?そして、なぜこのエラーが発生するのですか?

ありがとうございます!あなたの周囲のジェネリッククラスが制約をリストする必要があります

+0

TはICompareっぽい型クラス、およびTは宣言の中で、これらの参照を持って定義するメソッドまたはクラスを実装していることを確認してくださいを回避する良い方法

Equals(value1, value2) 

を試してみてください。 – asawyer

答えて

11

あなたはヘンクが述べたようにwhere T : IEquatable<T>の制約を使用、または制約および使用を無視するか:

if (!EqualityComparer<T>.Default.Equals(value1, value2)) 
+0

フレームワークが等価性をテストするためにこのメソッドを使用しているのを見たことがありますが、少し冗長であっても良い方法のようです。 –

+0

これは最も簡単な方法だと思います。ありがとう! – Girardi

+0

@Ani:そうです。私は、ジェネリックでないIEquatableインターフェイスはないことを忘れてしまいました。編集します。 –

3

T : IEquatable<T>

そして、あなたはすべてこの理由はない、すべての種類はこれで何が悪いオペレータ==

+0

@ani:そうです、私はそれを削除しました。私の想像力。 –

+0

'value1'が' null'ならば 'NullReferenceException'を返します。 – nicodemus13

2

を定義することであるvalue1.Equals(value2)

を使用する必要があります?

if (!value1.Equals(value2)) 

「クロスオブジェクト」である必要があります。.. :)

+2

個人的に私はそれの非対称性が気に入らない。もちろん、 'value1 == null'の場合はスローされます – CodesInChaos

0

ますもう一つはコンパイラは、演算子が以前に定義されている場合を除いて、value1 != value2を書くときにコンパイラが実際に何を意味するのかを実際には知ることができません(実際には、ここでは差分演算子)。 。演算子を定義するには

、あなたがvalue1.equals(値2)を使用する場合、あなたがnull値に問題がある

public operator!=(T a, T b) { 
    // Comparison code; returns true or false 
} 
+0

'T'は一般的なパラメータだと思うので、これはおそらく不可能です。 – CodesInChaos

+0

コンパイラがTが何であるかを正確に知っている場合にのみ動作します。 –

1

を使用すると思います。ベター:
はObject.equals(値1、値2)

または参照タイプ(注意が必要)のために:
object.referenceEquals(値1、値2)

1

すべての種類は、==オペレータのデフォルトの実装を持っていません。クラスの場合、デフォルトの==操作は参照を比較することです。構造体の場合、そのようなデフォルトの実装は存在しません。

C#のジェネリック型パラメータに型制約を追加できます。残念ながら、タイプに==演算子の実装を強制させる制約は定義できません。あなたができることは、型をクラスにすることです:where T: classAn article about type parameter constraints in C#

1

がnull参照の

関連する問題