2009-06-23 1 views
5

मुझे समझ नहीं आता क्या यहाँ पर जा रहा है के साथ सी # मुक्केबाजी enum त्रुटि ...जेनरिक

मैं निम्न त्रुटि मिल गया है: प्रकार 'TestApp.TestVal' सामान्य प्रकार में प्रकार पैरामीटर 'T' के रूप में इस्तेमाल नहीं किया जा सकता या विधि 'TestApp.SomeClass<T>''TestApp.TestVal' से 'System.IComparable<TestApp.TestVal>' पर कोई मुक्केबाजी रूपांतरण नहीं है। निम्नलिखित कोड के लिए

यह त्रुटि होता है:

public enum TestVal 
{ 
    First, 
    Second, 
    Third 
} 

public class SomeClass<T> 
    where T : IComparable<T> 
{ 
    public T Stored 
    { 
     get 
     { 
      return storedval; 
     } 
     set 
     { 
      storedval = value; 
     } 
    } 
    private T storedval; 
} 

class Program 
{ 
    static void Main(string[] args) 
    { 
     //Error is on the next line 
     SomeClass<TestVal> t = new SomeClass<TestVal>(); 
    } 
} 

के बाद से enum डिफ़ॉल्ट रूप से एक int है और int के IComparable<int> इंटरफेस ऐसा लगता लागू की तरह उसमें कोई त्रुटि नहीं होना चाहिए ....

+0

पूर्णांक के IComparable लगा देंगी, लेकिन इसका मतलब यह नहीं है कि RandomEnumType लागू करता IComparable । – AakashM

उत्तर

8

सबसे पहले, मुझे यकीन नहीं है कि IComparable<T> का उपयोग enum के साथ करने के लिए समझदार है ... IEquatable<T>, निश्चित रूप से - लेकिन तुलना?

एक सुरक्षित विकल्प के रूप में; सामान्य बाधा के साथ IComparable<T> को जरूरी बनाने के बजाय, शायद कक्षा के अंदर Comparer<T>.Default का उपयोग करें। इसका IComparable<T> और IComparable का समर्थन करने का लाभ है - और इसका मतलब है कि प्रचार करने के लिए आपके पास कम बाधाएं हैं।

उदाहरण के लिए:

public class SomeClass<T> { // note no constraint 
    public int ExampleCompareTo(T other) { 
     return Comparer<T>.Default.Compare(Stored, other); 
    } 
    ... [snip] 
} 

इस enum के साथ ठीक काम करता है:

SomeClass<TestVal> t = new SomeClass<TestVal>(); 
t.Stored = TestVal.First; 
int i = t.ExampleCompareTo(TestVal.Second); // -1 
+0

मेरी समस्या के संभावित वैकल्पिक समाधान के लिए धन्यवाद। वास्तविक कोड एक परीक्षण ढांचे में बहुत गहरा है जिसे किसी भी प्रकार के परीक्षण डेटा को संभालने की आवश्यकता होती है। मुझे कुछ और जांच करनी होगी, लेकिन ऐसा लगता है कि आपका कोड मेरी जेनेरिक ऑब्जेक्ट्स की तुलना में निपटने का एक बेहतर तरीका हो सकता है .... –

+0

कूल ट्रिक धन्यवाद !! –

0

सी # enums में IComparable लागू करें, लेकिन जेनेरिक IComparable<T> नहीं। मुझे यकीन नहीं है कि यह क्यों है, लेकिन हो सकता है कि आप अपने जहां खंड में गैर-जेनेरिक IComparable पर स्विच कर सकें।

5

Enums System.Int32s से प्राप्त नहीं होते हैं - वे System.Enum से प्राप्त होते हैं, जो IComparable<int> लागू नहीं करता है (हालांकि यह IComparable लागू करता है)।

हालांकि एक enum का अंतर्निहित मूल्य डिफ़ॉल्ट रूप से एक int है, enum स्वयं नहीं है। इस प्रकार, दोनों के बीच कोई रूपांतरण नहीं है।

+0

(मैंने मार्कडाउन तय किया - और फिर पागल हो गया और अपना जवाब इसके बजाए संपादित कर दिया! अब फिक्स्ड; इसके बारे में खेद है ...) –

+0

स्पष्टीकरण के लिए धन्यवाद। यह सहायता करता है। यह मुझे आश्चर्य भी करता है कि अगर मुझे structs के साथ एक ही तरह की समस्या होगी .... –

0

Enum IComparable<T> को लागू नहीं करता है, लेकिन यह IComparable को लागू करता है। तो एक enum में टी हो सकता है जहां खंड की तरह एक:

where T : IComparable 

लेकिन यह एक त्रुटि देता है:

where T : IComparable<T> 

और फिर मुझे लगता है कि आप SomeClass चाहते हैं तुलनीय किया जाना है। ऐसा करने के लिए, इसे आईसीओपरपेबल को स्वयं लागू करना होगा।

यहाँ दोनों का एक उदाहरण (एक सार्वजनिक सदस्य का उपयोग कोड सरल रखने के लिए) है:

public class SomeClass<T> 
    : IComparable<SomeClass<T>> 
    where T : IComparable 
{ 
    public T storedval; 

    public int CompareTo(SomeClass<T> other) 
    { 
     return storedval.CompareTo(other.storedval); 
    } 
} 

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

  • कोई संबंधित समस्या नहीं^_^