मैं एक वर्ग Person
है, यह IEquatable<Person>
से बराबर है() विधि को लागू करता है (यह भी Object.Equals
विधि ओवरराइड करता है, की सुविधा देता है अब के लिए विधि GetHashcode() पर ध्यान न दें)समानता कॉम्पैयर <T>। डीफॉल्ट गलतफहमी?
class Person : IEquatable<Person>
{
public string Name { get; set; }
public bool Equals(Person other)
{
return this.Name == other.Name;
}
public override bool Equals(object obj)
{
var person = obj as Person;
return person != null && person.Name == Name;
}
}
ठीक है, की सुविधा देता है शुरू:
Person p1 = new Person() { Name = "a" };
Person p2 = new Person() { Name = "a" };
List<Person> lst1 = new List<Person>() { p1 };
List<Person> lst2 = new List<Person>() { p2 };
इस लाइन के बारे में बात करने देता है:
bool b = lst1.SequenceEqual(lst2, EqualityComparer<Person>.Default);
मैं इस पी समझने एक समस्या है कला:
EqualityComparer<Person>.Default
मैंने सुना है अगर वर्ग IEquatable
लागू कर रहा है कि EqualityComparer<Person>.Default
की जाँच करेगा - यह Equals(Person other)
विधि और नहीं Equals(object obj)
ले जाएगा। यह मुक्केबाजी
लेकिन
Equals(Person other)
से बचने का लाभ के साथ या बिनाEqualityComparer<Person>.Default
(क्योंकि यह IEquatable को लागू है) तो क्या मुक्केबाजी के बारे में हम बात कर रहे हैं चलेंगे है ? वहाँ नहीं है!
bool b = lst1.SequenceEqual(lst2,EqualityComparer<Object>.Default);
लेकिन मैं एक प्रोग्रामर हूँ:
केवल समय है कि Equals(object obj)
चलेंगे जब है! मैं object
कभी नहीं भेजूंगा जब यह वास्तव में Person
होगा!
मुझे क्या याद आ रही है? मुझे EqualityComparer<Object>.Default
के लाभ को समझने में परेशानी हो रही है। क्या कोई मुझे साबित करने के लिए एक उदाहरण दे सकता है कि मैं गलत हूं?
आप क्या समझ नहीं सकते? 'IEqualityComparer
यह इसके साथ या उसके साथ क्यों काम करता है, और मेरे पास
टाइप करने का कारण क्यों है, बॉक्सिंग केवल मूल्य प्रकारों के लिए होती है। चूंकि 'व्यक्ति' एक संदर्भ प्रकार है, इसलिए इस मामले में कोई मुक्केबाजी शामिल नहीं है। – thecoop