i using visual studio community 2017. when create class, in quick actions menu, can choose "generate equals(object)".
let's have account class:
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; } } the generated methods are:
public override bool equals(object obj) {     return equals(obj 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); } for  comments , label visual studio uses ==, while id, list , lawyer uses equalitycomparer.
my first thought == used value types while equalitycomparer used reference types. problem string not value type (although used 1 in equality context) , ushort? not reference type.
my second thought because ushort?, list , lawyer accept null. problem string accepts null well.
so rule? when chooses equalitycomparer , when uses simple ==? why?
type nullable<t> not have operator ==, not implement iequatable<t> interface , has object.equals(object other) method. direct calling of object.equals value types unwanted.
therefore, equalitycomparer<ushort?>.default.equals used. implemented as:
internal class nullableequalitycomparer<t> : equalitycomparer<nullable<t>> 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; } 
Comments
Post a Comment