私はVisual Studio Community 2017を使用しています。クイックアクションメニューでクラスを作成するときに、 "Generate Equals(オブジェクト)"を選択できます。Equalsを自動生成するときにVisual StudioがEqualityComparerを使用するのはなぜですか?
のは、私がAccount
クラスがあるとしましょう:
class Account
{
public ushort? Id { get; private set; }
public string Comments { get; private set; }
public List<Contact> Contacts { get; private set; }
public string Label { get; private set; }
public Lawyer Lawyer { get; private set; }
}
生成されたメソッドがあります:Id
、List
とLawyer
ことがEqualityComparer
を使用しながら、
public override bool Equals(object obj)
{
return Equals(obj as Account);
}
public bool Equals(Account other)
{
return other != null &&
EqualityComparer<ushort?>.Default.Equals(Id, other.Id) &&
Comments == other.Comments &&
EqualityComparer<List<Contact>>.Default.Equals(Contacts, other.Contacts) &&
Label == other.Label &&
EqualityComparer<Lawyer>.Default.Equals(Lawyer, other.Lawyer);
}
Comments
とLabel
のためのVisual Studioは、==
を使用しています。
最初の考えは==
が値の種類に使用され、EqualityComparer
は参照の種類に使用されていました。問題は、string
が値型ではない(等価コンテキストでは1つとして使用されていますが)ushort?
は参照型ではありません。
私の考えは、ushort?
,List
およびLawyer
がnull
と受け入れられたからです。問題は、string
がnull
を受け入れることです。
だからルールは何ですか? EqualityComparer
を選択した場合、それは単純な==
を使用していますか?どうして?
ありがとう:それは次のように実装されています! null可能な型に演算子 '=='がない場合、なぜこれを行うことができますか? 'uint? a = 5; uint? b = 6; Console.WriteLine(a == b); '? – Sipo
代わりにコンパイラに特別扱いNULL可能なタイプと実装 '演算子==は' null非許容型に対して対応するオペレータを使用しているため。それがどのように実装されているか見るにはildasmを使います。 –