2017-01-06 3 views
14

मैं समझने की कोशिश कर रहा हूं कि सी # में संस्करण और जेनेरिक के संबंध में एक विशिष्ट व्यवहार संकलित क्यों नहीं होता है।संस्करण और खुले जेनेरिक IReadOnlyList

class Matrix<TLine> where TLine : ILine 
{ 
    TLine[] _lines; 

    IReadOnlyList<ILine> Lines { get { return _lines; } } //does not compile 
    IReadOnlyList<TLine> Lines { get { return _lines; } } //compile 
} 

मैं नहीं समझ सकता क्यों इस के रूप में काम नहीं करता है:

  • _lines, प्रकार TLine[] की जा रही है, को लागू करता है IReadOnlyList<TLine>
  • IReadOnlyList<out T>, एक प्रकार जेनेरिक इंटरफेस है, जिसका अर्थ है जहाँ तक मैं समझता हूं कि IReadOnlyList<TLine> को लागू करने वाले कुछ भी IReadOnlyList<ILine>
के रूप में उपयोग किए जा सकते हैं 0

मुझे लगता है कि यह होना चाहिए क्योंकि प्रकार की बाधा को ध्यान में नहीं रखा जाता है, लेकिन मुझे शक है।

+6

मुझे लगता है कि आपको 'TLine' -' वर्ग मैट्रिक्स पर 'वर्ग' बाधा जोड़ने की आवश्यकता है जहां TLine: ILine, class'। 'IReadOnlyList 'का कॉन्वर्सिस लागू नहीं होता है यदि' टी' एक मान प्रकार है, तो आपको संदर्भ प्रकार होने के लिए' TLine' को प्रतिबंधित करने की आवश्यकता है। – Lee

+0

@Lee मुझे यह नहीं पता था कि, आपको इसे उत्तर के रूप में पोस्ट करना चाहिए क्योंकि यह ओपीएस समस्या हल करता है;) – nozzleman

उत्तर

13

तुम बस TLine को class बाधा जोड़ने की जरूरत:

class Matrix<TLine> where TLine : class, ILine 

यह सुनिश्चित होगा कि TLine एक संदर्भ प्रकार है - जो तब सामान्य विचरण काम करने के लिए अनुमति देता है। Variance केवल संदर्भ प्रकारों के लिए काम करता है, क्योंकि इस तरह सीएलआर जानता है कि TLine के प्रकार का उपयोग किसी भी मुक्केबाजी या प्रतिनिधित्व में अन्य परिवर्तन के बिना ILine के प्रकार के रूप में किया जा सकता है।

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