2012-08-13 15 views
6

सटीक कोड मैं का निर्माण करने की कोशिश कर रहा हूँ:यह एक अवैध भिन्नता क्यों है?

public interface IMapContainer<out T> where T : MapRoomBase 
    { 
     String GetName(); 

     IEnumerable<T> GetRooms(); 
    } 

मैं इस त्रुटि हो रही है: अमान्य विचरण: प्रकार पैरामीटर 'टी' 'MapLibrary.IMapContainer.GetRooms()' पर invariantly मान्य होना चाहिए। 'टी' कॉन्वर्सेंट है।

मैं इस धारणा के तहत था कि यह मान्य होगा क्योंकि आईनेमेरेबल केवल आइटम लौटाता है, और कोई भी जोड़ा नहीं जा सकता है। यह सुरक्षित क्यों नहीं है + वैध?

+0

मुझे खेद है, लेकिन क्यों टी बाहर? क्या आपको उस 'आउट' की ज़रूरत है? –

+0

आपके इंटरफ़ेस से टी आउट आउट पैरामीटर क्यों है ?? आप क्या हासिल करने का प्रयास कर रहे हैं? मेरे परिप्रेक्ष्य से जो विषम/गलत दिखता है। –

+1

@ एक्सटियन, आंद्रे, http://msdn.microsoft.com/en-us/library/dd997386.aspx। –

उत्तर

7

सुनिश्चित करें कि आप पुराने फ्रेमवर्क संस्करण को लक्षित नहीं कर रहे हैं। IEnumerable<T> .NET 4 से शुरू होने वाला कॉन्वर्सेट है। आपका कोड .NET 4 के अंतर्गत ठीक से संकलित करता है और आपके द्वारा उल्लेख की गई त्रुटि .NET 3.5 पर विफल रहता है।

+0

मैं वास्तव में सिल्वरलाइट 4 ढांचे को लक्षित कर रहा हूं .. – Erix

+0

ऐसा लगता है कि covariance एसएल 4 में IENumerable में समर्थित नहीं है। आपके उत्तर ने मुझे यह खोजने में मदद की, हालांकि मुझे समझ में नहीं आया कि यह क्यों है ... http: // forums.silverlight.net/t/184882.aspx/1 – Erix

+3

कोविरिएंस एसएल 4 में समर्थित है, बस बीसीएल प्रकारों जैसे आईएनमेर्यूरेबल को केवल एसएल 5 में कॉन्विएन्ट बनाया गया है [SO answer] (http://stackoverflow.com/a/2558592/872,395) – nemesv

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