2011-02-02 10 views
5

मैं निम्नलिखित वर्गों है और मैं ExportFileBaseBL वर्ग से विधि की तुलना करें कॉल करने के लिए कोशिश कर रहा हूँ, लेकिन मैं त्रुटि मिलती हैसी # जेनेरिक्स - एक सामान्य वर्ग से सामान्य विधि कॉलिंग

परोक्ष 'टी' के लिए प्रकार 'Class1' कनवर्ट नहीं कर सकता । एक स्पष्ट रूपांतरण मौजूद है (यदि आप एक डाली याद कर रहे हैं?)

public abstract class Class1<T> where T: Class2 
{ 
    public abstract Class1<T> Compare(Class1<T> otherObj); 
} 

public abstract class Class3<T, U> where T: Class1<U> 
         where U: Class2 
{ 
    public T Compare(T obj1, T obj2) 
    { 
     if (obj1.Prop1 > obj2.Prop1) 
     { 
      return obj1.Compare(obj2); // Compiler Error here 
     } 
     else 
     { 
      return obj2.Compare(obj1); // Compiler Error here 
     } 
    } 

} 

नहीं जैसे रूपांतरण निहित होना चाहिए? क्या मैं कुछ भूल रहा हूँ?

उत्तर

4

समस्या यह है कि अपने सार Compare विधि प्रकार Class1<T> की एक पैरामीटर स्वीकार करने और एक वापस जाने के लिए परिभाषित किया गया है Class1<T>, का उदाहरण Class1<T> से अधिक विशिष्ट प्रकार नहीं है। लेकिन यह है कि आपकी Class3.Compare विधि करने का प्रयास कर रहा है: T.Compare पर कॉल करें और मान लें कि आउटपुट T होगा, वास्तव में आप केवल यह सुनिश्चित कर सकते हैं कि यह Class1<U> होगा।

एक सरल, अधिक सुबोध उदाहरण प्रदान करने के लिए, मान लीजिए मैं इस वर्ग के लिए किया था: कि parser.Parse एक int वापस आ जाएगी सिर्फ इसलिए intobject से निकला है:

class Parser 
{ 
    public abstract object Parse(string text); 
} 

class Int32Parser 
{ 
    public int Parse(Parser parser, string text) 
    { 
     return parser.Parse(text); 
    } 
} 

ऊपर कोड अपने खुद के लिए इसी तरह की एक दोषपूर्ण धारणा बनाता है (जैसा कि आपके मामले में है, TClass1<U> से प्राप्त होना चाहिए); वास्तव में, आप केवल यह सुनिश्चित कर सकते हैं कि यह object लौटाएगा।

वहाँ इस समस्या को दूर करने के दो तरीके मैं देख सकता हैं: Class1<T>.Compare एक सामान्य विधि बनाने:

public abstract U Compare<U>(U otherObj) where U : Class1<T>; 

... या अपने Class3.Compare विधि द्वारा दिया गया मान के प्रकार विशिष्टता आराम:

public Class1<U> Compare(T obj1, T obj2) 
{ 
    // ... 
} 

व्यक्तिगत रूप से, मैं दूसरा पसंद करूंगा जबतक कि आपको बिल्कुल पहले की आवश्यकता न हो। इन सभी जेनेरिक प्रकार की बाधाएं बहुत गन्दा हो सकती हैं और जब आप जटिलता इस तरह बढ़ने लगती हैं तो आप अपेक्षा करते हैं।

+0

धन्यवाद दान, जो मेरे प्रश्न का उत्तर देता है। – logik6

+0

जुप जप, अब हमने तुलना विधि टाइपिंग पर एक अद्यतन जोड़ा है, मैं उत्तर से सहमत हूं। – jcolebrand

2

विधि को कॉल करें जिसमें आप अपने वर्ग स्तर पर घोषित पैरामीटर प्रकार के साथ कॉल करें।

return obj1.Compare<T>(obj2); 

आप करने की आवश्यकता होगी की तुलना करें विधि सामान्य रूप में अच्छी तरह की परिभाषा:

public abstract Class1<T> Compare<T>(Class1<T> otherObj); 
+1

तुलना विधि सामान्य नहीं है, इसलिए यह अपने वर्तमान रूप में एक प्रकार पैरामीटर स्वीकार नहीं करेगा। –

+0

लेकिन @ केली जो सिर्फ यह बताती है कि इसे मूल कोड में कहां तय करना है। उसे प्रथम श्रेणी की तुलना विधि में ' 'जोड़ने की आवश्यकता है। – jcolebrand

+0

इसे तब उत्तर में जोड़ा जाना चाहिए। मैं इसे जोड़ दूंगा। –