2

私はC#をDepthで読んでいて、これに出くわしました。これは理解できます。

参照型に制約されている場合、実行される比較の種類は、型パラメーターがどのように制約されているかによって異なります。

しかし、これを理解することはできません:

==および!=演算子をオーバーロードする特定の型から派生するようにさらに制約されている場合は、それらのオーバーロードが使用されます。

誰かが例を通してこれを説明してくれるなら、私は非常に感謝します... Plzz

4

2 に答える 2

3

==および!=は、等式および非等式演算子です。

これらはさまざまな型でオーバーライドできます。オーバーライドされた型では、ジェネリック型制約として使用される場合、この実装はこれらの演算子を使用した比較に使用されます。

あなたの例では、以下をオーバーライドする型に追加の制約がないため、その行は適用されません==

static bool AreReferencesEqual<T> (T first, T second) where T : class
{ 
  return first==second; 
}

あなたがそのようなタイプを持っていたなら(それはまた継承に開かれていました)そして:

制約されている型がT過負荷にならない場合は==、単純な参照等価性テストが実行されます(デフォルトのObject実装)。

ただし、型が過負荷になる場合==(たとえば、2つのインスタンスが同じである場合、それらが同一であると見なされるビジネスエンティティid)、その型または継承型を渡すかどうかに関係なく、その実装が使用されます。

Personをオーバーライドするクラスについて考えてみます==。そして、typeパラメーターをに制約しているメソッドPersonEmployeeから派生しPerson、オーバーライド==する==が、汎用メソッドで使用する場合は、使用==されるものが使用されますPerson

于 2013-01-27T18:27:31.800 に答える
1

operator==and (最初の引用符)のない参照型に制約されているoperator!=場合、コンパイラーは、use以外の型の同等性についての知識がないことを認識しますObject.Equals。これは単に参照比較を行うだけです。

制約がandを持つ型である場合operator==コンパイラーはoperator!=Object.Equals同等性に使用できるものが他にあることを十分に認識しているため、型を使用して同等性operator==をテストします(通常は参照比較以外のものです)。

于 2013-01-27T18:43:43.710 に答える