2013-05-15 4 views
9

मैं List.Sort( का उपयोग कर वस्तुओं की एक सूची क्रमबद्ध करने की कोशिश कर रहा हूं), लेकिन रनटाइम पर यह मुझे बताता है कि यह सरणी में तत्वों की तुलना नहीं कर सकता है।मैं पूर्वजों के वर्ग पर आईसीओपरपेबल <T> का उपयोग क्यों नहीं कर सकता और बाल कक्षाओं की तुलना क्यों कर सकता हूं?

public abstract class Parent : IComparable<Parent> { 
    public string Title; 
    public Parent(string title){this.Title = title;} 

    public int CompareTo(Parent other){ 
     return this.Title.CompareTo(other.Title); 
    } 
} 

public class Child : Parent { 
    public Child(string title):base(title){} 
} 

List<Child> children = GetChildren(); 
children.Sort(); //Fails with "Failed to compare two elements in the array." 

मैं एक आधार है कि IComparable<T> लागू करता है के उपवर्गों क्यों की तुलना नहीं कर सकते हैं:

वर्ग संरचना सरणी में दो तत्वों की तुलना करने में विफल? मुझे शायद कुछ याद आ रहा है, लेकिन मैं नहीं देख सकता कि इसकी अनुमति क्यों नहीं दी जानी चाहिए।

संपादित करें: स्पष्ट करना चाहिए कि मैं .NET 3.5 लक्षित कर रहा हूँ (2010 SharePoint)

EDIT2: .NET 3.5 समस्या है (नीचे का जवाब देखें)।

+2

जैसा कि यह एक रनटाइम अपवाद प्रतीत होता है, हो सकता है कि आपके बच्चों में से एक को शून्य का 'शीर्षक' हो? या शायद आपकी सूची में एक शून्य है? – nvoigt

+0

http://stackoverflow.com/questions/1658661/failed-to-compare-two-elements-in-the-array –

+3

यह मेरे लिए .NET 4 के साथ काम करता है लेकिन [** ideone ** पर नहीं) [http: //ideone.com/rZ0rVL), आप किस .NET-version का उपयोग कर रहे हैं? –

उत्तर

11

मुझे लगता है कि यह .NET 4.0 से पहले एक .NET संस्करण है; .NET 4.0 के बाद यह IComparable<in T> है, और कई मामलों में ठीक काम करना चाहिए - लेकिन इस 4.0

में विचरण परिवर्तन सूची List<Child> है की आवश्यकता है - लेकिन उन में से कोई भी है - तो यह उपयोग करने के लिए या तो IComparable<Child> या IComparable कोशिश करेंगे छँटाई कार्यान्वित किया। आप Parent स्तर पर IComparable को लागू कर सकता है, शायद:

public abstract class Parent : IComparable<Parent>, IComparable { 
    public string Title; 
    public Parent(string title){this.Title = title;} 

    int IComparable.CompareTo(object other) { 
     return CompareTo((Parent)other); 
    } 
    public int CompareTo(Parent other){ 
     return this.Title.CompareTo(other.Title); 
    } 
} 

जो object के माध्यम से एक ही तर्क लागू होगी।

+0

मुझे पता है कि मैं IComparable का उपयोग कर सकते हैं, लेकिन मैं वास्तव में केवल माता-पिता से प्राप्त दो वर्गों की तुलना में समर्थन करना चाहता हूं। बच्चा यहां सभी माता-पिता के बाद है इसलिए मुझे समझ में नहीं आता कि मैं इसे उपरोक्त की तरह क्यों लागू नहीं कर सकता। – Thomas

+0

हां, लेकिन माता-पिता तुलनाकर्ता का उपयोग करना क्यों संभव नहीं है? यदि यह अलग स्थैतिक कार्य था, तो यह संभव होगा। बेस-क्लास तुलना करने वालों के लिए संकलक खोज नहीं करना चाहिए? यह संभव हो सकता है, लेकिन शायद लागू नहीं किया गया है ... –

+0

दरअसल, कोड मेरे लिए काम करता है और सही तरीके से काम करता है। यह निश्चित रूप से काम नहीं करता है अगर 'IComparable ' कार्यान्वयन हटा दिया गया है। * अपडेट *: यह निश्चित रूप से .NET 4. – Jon

संबंधित मुद्दे