2012-10-05 23 views
19

मान लें मैं इंटरफ़ेस और वर्ग है:क्यों सहप्रसरण सामान्य विधि के साथ काम नहीं करता है

public interface ITree {} 
public class Tree : ITree {} 

IEnumerable<T> रूप covariant है, नीचे दिए गए कोड लाइन सफलतापूर्वक संकलित किया गया है:

IEnumerable<ITree> trees = new List<Tree>(); 

लेकिन जब मैं इसे सामान्य विधि में रखें:

public void Do<T>() where T : ITree 
{ 
    IEnumerable<ITree> trees = new List<T>(); 
} 

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

त्रुटि 1 परोक्ष 'System.Collections.Generic.IEnumerable' के लिए कनवर्ट नहीं कर सकता प्रकार 'System.Collections.Generic.List'। एक स्पष्ट रूपांतरण मौजूद है (यदि आप एक डाली याद कर रहे हैं?) डी: \ प्रयोगशाला \ Lab.General \ Lab.General \ Program.cs 83 40 Lab.General

क्यों सहप्रसरण इस मामले में काम नहीं करता है?

+0

के संभावित डुप्लिकेट ([? इस सी # 4 में एक सहप्रसरण बग है] http://stackoverflow.com/questions/2783233/is-this-a-covariance -Bug-इन-सी तेज -4) – nawfal

उत्तर

22

है ऐसा इसलिए है क्योंकि विचरण केवल संदर्भ के प्रकार (कक्षाएं, इंटरफेस & प्रतिनिधियों) के साथ काम करता है। एक वर्ग स्थिर बिंदु जोड़ें और यह सिर्फ ठीक संकलित:

public static void Do<T>() where T : class, ITree 
+1

धन्यवाद, मैं गुमराह कि जब बाधा 'टी कर रही: यह निहित है ITree' कि टी संदर्भ प्रकार, एक है, लेकिन यह वास्तव में –

+0

तो' ITree' एक अंतरफलक प्रकार है नहीं है प्रकार के भंडारण स्थान 'ITree' हमेशा या तो' null' या एक ढेर उद्देश्य यह है कि 'लागू करता ITree' के लिए एक संदर्भ है, लेकिन एक सामान्य प्रकार' करने के लिए विवश की एक भंडारण स्थान का आयोजन करेगा ITree' एक संदर्भ पकड़ सकता है या यह एक वास्तविक पकड़ सकता है एक मूल्य प्रकार का उदाहरण जो 'ITree' लागू करता है। व्यक्तिगत रूप से, मैं इस तरह से नापसंद करता हूं कि इंटरफेस को लागू करने वाले structs को ढेर संदर्भों में रूपांतरित कर दिया गया है जो इस इंटरफेस को इस मामले में किसी भी कहने के बिना लागू करते हैं। मूल्य-प्रकार अर्थ विज्ञान में उपयोगी तरीकों से rerefence अर्थ विज्ञान से अलग है, लेकिन ... – supercat

+0

... "एकीकृत प्रकार प्रणाली" मॉडल मानता है (गलत तरीके से) है कि वे समान रूप से व्यवहार करेंगे। प्रकार 'सूची ' का एक चर 'एन्यूमेरेटर' लागू करता है 'आईनेमरेबल ', लेकिन कुछ ऐसा व्यवहार करता है जिसका व्यवहार 'IENumerable ' प्रकार के चर से बहुत अलग है, जिसमें 'सूची । न्यूमेरेटर' का संदर्भ है। – supercat

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