2015-02-11 8 views
13

निम्न उदाहरण पर विचार करें:मैं दो सामान्य प्रकार के पैरामीटर के साथ कॉन्वर्सिस का उपयोग क्यों नहीं कर सकता?

class Base {} 

class Derived : Base {} 

class Test1 
{ 
    private List<Derived> m_X; 

    public IEnumerable<Base> GetEnumerable() 
    { 
     return m_X; 
    } 
} 

यह ठीक संकलित, क्योंकि IEnumerable<T>T में covariant है।

हालांकि, अगर मैं बिल्कुल वही बात है, लेकिन अब जेनरिक के साथ कार्य करें:

class Test2<TBase, TDerived> where TDerived : TBase 
{ 
    private List<TDerived> m_X; 

    public IEnumerable<TBase> GetEnumerable() 
    { 
     return m_X; 
    } 
} 

मैं संकलक त्रुटि मिलती है

कनवर्ट नहीं कर सकता अभिव्यक्ति प्रकार 'System.Collection.Generic.List' वापस 'System.Collection.Generic.IEnumerable'

मैं यहां क्या गलत कर रहा हूं?

+0

मुझे लगता है कि 'वापसी m_X.Cast ();' का उपयोग करके, एक स्पष्टीकरण होना चाहिए, 'आपके मामले को हल करेगा। – AgentFire

उत्तर

13

बात पहली बात है, Base को कक्षा माना जाता है। दूसरे मामले में, प्रकार पैरामीटर T या तो वर्ग या संरचना हो सकता है (इस प्रकार संकलक सोचता है)।

को निर्दिष्ट है कि T एक वर्ग है द्वारा मामले का समाधान, और त्रुटि गायब हो जाएगा:

class Test2<TBase, TDerived> where TDerived : class, TBase 
{ 
    private List<TDerived> m_X; 

    public IEnumerable<TBase> GetEnumerable() 
    { 
     return m_X; 
    } 
} 

तो, संकलक की कोशिश करता है हमें दिखाने के लिए TDerived एक struct हो सकता है कि (जब से तुम class निर्दिष्ट नहीं किया है बाधा) और as wealready know, कॉन्वर्सिस और contravariance structs के साथ काम नहीं करते हैं।

+0

मेरी अज्ञानता को क्षमा करें क्योंकि मैं अभी भी सी # के लिए बिल्कुल नया हूं (या हो सकता है कि यह सामान्य रूप से .NET के बारे में उन वास्तव में छेड़छाड़ की बातों में से एक है), लेकिन यह तथ्य नहीं है कि 'टीडीरिव' 'टीबीएसई 'से निकला है - जो है एक वर्ग - 'टीडीरिव' है, खुद, एक वर्ग या संरचना के संबंध में अस्पष्टता को रोकें? क्या आप कक्षा से एक संरचना प्राप्त कर सकते हैं? –

+0

दिलचस्प! मैंने कोशिश की 'जहां टीबेस: कक्षा' लेकिन इसका कोई प्रभाव नहीं पड़ा। –

+0

@ roryap सी # हाँ, लेकिन सीएलआर में जरूरी नहीं है। 'ValueType' एक वर्ग है, लेकिन सभी structs इससे प्राप्त होते हैं। –

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

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