2010-02-16 15 views
7

पर कनवर्ट करने के लिए कैसे करें मुझे यकीन है कि मुझे कुछ आसान याद आ रही है, हालांकि मैं उन ऑब्जेक्ट्स की दृढ़ता से टाइप की गई सूची को परिवर्तित करने की कोशिश कर रहा हूं जो सभी इंटरफ़ेस प्रकार की सूची में इंटरफ़ेस को लागू करते हैं ।एक सामान्य सूची <T> को एक इंटरफ़ेस आधारित सूची <T>

नीचे त्रुटि प्रदर्शित करने के लिए एक नमूना है:

public void ExampleCode(){ 
    List<Cube> cubes = new List<Cube>(); 
    List<Shape> allShapes; 
    allShapes = cubes;//Syntax Error 
    allShapes = (List<Shape>)cubes;//Syntax Error 
} 

public class Cube : Shape 
{ 
    public int ID { get; set; } 
    public int Sides { get; set; } 
} 

public interface Shape 
{ 
    int ID { get; set; } 
    int Sides { get; set; } 
} 
+0

एनबी: प्रश्न में कोड एक कलाकारों के रूप में phrased है (एक ही वस्तु की अर्थात् अलग दृष्टिकोण)। नीचे दिए गए विभिन्न कार्य सूची सूची की प्रतिलिपि बनाते हैं - एक नई सूची बनाई जाती है और प्रत्येक आकार तत्व नई सूची में जोड़ा जाता है - एक अलग वस्तु प्रदान करता है, एक ही ऑब्जेक्ट पर एक अलग दृश्य नहीं। –

उत्तर

13
इसके बजाय इस तरह कास्टिंग के

, कोशिश:

allShapes = cubes.Cast<Shape>().ToList(); 

आप इस के लिए .NET 3.5 की जरूरत है। मेरा मानना ​​है कि कास्ट एक्सटेंशन विधि System.Linq में पाई जा सकती है।

+1

आपने मुझे इसे हराया। – Steven

+2

नोट, यह सूची की प्रतिलिपि बनाता है (यद्यपि इसमें संदर्भ संदर्भ हैं और ऑब्जेक्ट्स की प्रतिलिपि नहीं बनाई जाएगी)। यह सूची वस्तु को स्वयं कास्टिंग के समान नहीं है। – Richard

+1

@ रिचर्ड: ग्रेट प्वाइंट। –

6

आप नहीं कर सकते। क्योंकि List<T> और ILIst<T> केवल इनवेरिएंट प्रकार पैरामीटर का समर्थन करने के लिए। यह T पर इनपुट और आउटपुट पैरामीटर (जैसे वापसी मूल्य) दोनों के लिए उपयोग किया जा रहा है। अन्यथा आप प्रकार की सुरक्षा तोड़ सकते हैं।

अन्य इंटरफेस (उदा। IEntumerable<T>) कुछ भिन्नता की अनुमति देते हैं।

अनुबंध और सह-भिन्नता की चर्चा के लिए एरिक लिपर्ट के ब्लॉग "Fabulous Adventures In Coding" देखें। विशेष रूप से "Covariance and Contravariance" टैग।

संपादित करें, बस के लिए "सी # सवाल जवाब" जोड़ा ब्लॉग: Covariance and Contravariance FAQ

2

आप इस तरह से आप संभवतः सभी प्रकार के सुरक्षा खो सकते हैं कास्टिंग द्वारा के बाद से ऐसा नहीं कर सकते। इंस्टेंस के लिए, List<Shape> से List<object> का परिणाम की किसी भी प्रकार की सूची में जोड़ा जा सकता है, जो कमजोर असंगत होगा।

0

तुम भी कर सकते हैं:

allShapes = cubes.ConvertAll(x => (Shape)x); 

या आप इस में क्या कर रहे हैं, तो .NET 2.0:

allShapes = cubes.ConvertAll<Shape>(delegate(Cube c){ 
    return (Shape)c; 
}); 
0

आप प्रकार के सूचियों के बीच डाली नहीं कर सकते, प्रकार खुद को कर रहे हैं, भले ही परिवर्तनीय। आपको मूल सूची को पुन: या कन्वर्टएल का उपयोग करके, एक नई सूची बनाने और इसे पॉप्युलेट करने की आवश्यकता होगी। नमूना कोड के लिए http://www.dev102.com/2008/05/15/how-to-convert-listt1-to-listt2/ देखें।

4

क्या आप की बात कर रहे सामान्य सहप्रसरण कहा जाता है और # 3. ग द्वारा समर्थित नहीं है यह है, तथापि, सी # 4 (नेट 4/VS 2010) द्वारा समर्थित है और आप इसके बारे में यहाँ और अधिक पढ़ सकते हैं:

Variance in Generic Interfaces

यह कहकर कि, IList<T> कॉन्वेंट नहीं है (क्योंकि यह दोनों T स्वीकार करता है और खुलासा करता है)। दूसरी ओर, IEnumerable<T>, कॉन्वेंटेंट है (क्योंकि यह T स्वीकार नहीं करता है)।

0

यह काम करता है अगर आप 4.0 आप बस allshapes असाइन कर सकते हैं IEnumerable

रूप allShapes परिभाषित सी # में = क्यूब्स

सी # 3.5 आप allShapes इस्तेमाल कर सकते हैं = क्यूब्स के लिए।का चयन करें (ग => ((आकार) ग));

लेकिन किसी भी मामले आप सूची के बजाय IEnumerable उपयोग करने की आवश्यकता में

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