2017-09-10 4 views
3

私は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; } 
} 

生成されたメソッドがあります:IdListLawyerことが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); 
} 

CommentsLabelのためのVisual Studioは、==を使用しています。

最初の考えは==が値の種類に使用され、EqualityComparerは参照の種類に使用されていました。問題は、stringが値型ではない(等価コンテキストでは1つとして使用されていますが)ushort?は参照型ではありません。

私の考えは、ushort?,ListおよびLawyernullと受け入れられたからです。問題は、stringnullを受け入れることです。

だからルールは何ですか? EqualityComparerを選択した場合、それは単純な==を使用していますか?どうして?

答えて

2

タイプNullable<T>operator ==を持っていない、それはIEquatable<T>インタフェースを実装していないとそれだけでobject.Equals(object other)方法があります。しかし、値の型のためのobject.Equalsの直接呼び出しは不要です。

したがって、EqualityComparer<ushort?>.Default.Equalsが使用されます。

internal class NullableEqualityComparer<T> : EqualityComparer<Nullable<T>> where T : struct, IEquatable<T> 
{ 
    public override bool Equals(Nullable<T> x, Nullable<T> y) { 
     if (x.HasValue) { 
      if (y.HasValue) return x.value.Equals(y.value); 
      return false; 
     } 
     if (y.HasValue) return false; 
     return true; 
} 
+0

ありがとう:それは次のように実装されています! null可能な型に演算子 '=='がない場合、なぜこれを行うことができますか? 'uint? a = 5; uint? b = 6; Console.WriteLine(a == b); '? – Sipo

+0

代わりにコンパイラに特別扱いNULL可能なタイプと実装 '演算子==は' null非許容型に対して対応するオペレータを使用しているため。それがどのように実装されているか見るにはildasmを使います。 –

関連する問題