2010-04-21 10 views
5

मुझे समझ में नहीं आता कि क्यों 'x' नीचे परिवर्तित होता है, लेकिन 'y' और 'z' नहीं है।क्या सी # 4 का सामान्य ज्ञान जेनेरिकों का घोंसला है?

var list = new List<List<int>>(); 

IEnumerable<List<int>> x = list; 
List<IEnumerable<int>> y = list; 
IEnumerable<IEnumerable<int>> z = list; 

क्या नई कॉन्वर्सिस सुविधा जेनरिक के जेनरिक पर काम नहीं करती है या क्या मैं कुछ गलत कर रहा हूं? (मैं वाई और जेड काम करने के लिए .स्ट <> का उपयोग करना टालना चाहता हूं।)

उत्तर

7

"z" सी # 4.0, IEnumerable<T> में ठीक है। List<T> हालांकि नहीं है, आप "y" काम नहीं कर सकते हैं।

Intuitively, अगर यह थे तो यह वैध होगा:

List<IEnumerable<int>> y = list 
y.Add(new Stack<int>()); 

कौन सा वादा है कि "सूची" केवल List<int> तत्वों को शामिल कर सकते टूट जाता है।

+0

समस्या का ठीक हिस्सा यह था कि 'जेड' मेरे लिए काम नहीं कर रहा था क्योंकि मैं अभी भी 3.5 को लक्षित कर रहा था। उफ़। काम नहीं कर रहे 'वाई' पर स्पष्टीकरण के लिए धन्यवाद, यह समझ में आता है। – scobi

1

आप यहां कई गलतियां कर रहे हैं। सबसे पहले, covariance और contravariance मूल्य प्रकारों के लिए समर्थित नहीं हैं, इसलिए जो भी आप "int" के साथ करने का प्रयास करते हैं, काम नहीं करेगा।

दूसरा, वैध उदाहरण नेस्टेड सामान्य प्रकार में विचरण के लिए जाँच अधिक इस तरह दिखता है:

var list = new List<List<String>>(); 
IEnumerable<IEnumerable<object>> z = list; 

मैं वस्तुओं की IEnumerables की IEnumerable, जो सहप्रसरण है तार की सूची की सूची प्रदान कर सकते हैं। अधिक जानकारी के लिए, Covariance and Contravariance FAQ देखें।

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