私はC#をDepthで読んでいて、これに出くわしました。これは理解できます。
参照型に制約されている場合、実行される比較の種類は、型パラメーターがどのように制約されているかによって異なります。
しかし、これを理解することはできません:
==および!=演算子をオーバーロードする特定の型から派生するようにさらに制約されている場合は、それらのオーバーロードが使用されます。
誰かが例を通してこれを説明してくれるなら、私は非常に感謝します... Plzz
私はC#をDepthで読んでいて、これに出くわしました。これは理解できます。
参照型に制約されている場合、実行される比較の種類は、型パラメーターがどのように制約されているかによって異なります。
しかし、これを理解することはできません:
==および!=演算子をオーバーロードする特定の型から派生するようにさらに制約されている場合は、それらのオーバーロードが使用されます。
誰かが例を通してこれを説明してくれるなら、私は非常に感謝します... Plzz
==
および!=
は、等式および非等式演算子です。
これらはさまざまな型でオーバーライドできます。オーバーライドされた型では、ジェネリック型制約として使用される場合、この実装はこれらの演算子を使用した比較に使用されます。
あなたの例では、以下をオーバーライドする型に追加の制約がないため、その行は適用されません==
。
static bool AreReferencesEqual<T> (T first, T second) where T : class
{
return first==second;
}
あなたがそのようなタイプを持っていたなら(それはまた継承に開かれていました)そして:
制約されている型がT
過負荷にならない場合は==
、単純な参照等価性テストが実行されます(デフォルトのObject
実装)。
ただし、型が過負荷になる場合==
(たとえば、2つのインスタンスが同じである場合、それらが同一であると見なされるビジネスエンティティid
)、その型または継承型を渡すかどうかに関係なく、その実装が使用されます。
Person
をオーバーライドするクラスについて考えてみます==
。そして、typeパラメーターをに制約しているメソッドPerson
。Employee
から派生しPerson
、オーバーライド==
する==
が、汎用メソッドで使用する場合は、使用==
されるものが使用されますPerson
。
operator==
and (最初の引用符)のない参照型に制約されているoperator!=
場合、コンパイラーは、use以外の型の同等性についての知識がないことを認識しますObject.Equals
。これは単に参照比較を行うだけです。
制約がandを持つ型である場合、operator==
コンパイラーはoperator!=
、Object.Equals
同等性に使用できるものが他にあることを十分に認識しているため、型を使用して同等性operator==
をテストします(通常は参照比較以外のものです)。