2015-06-17 10 views
5

सी # में, यदि मेरे पास एक फ़ंक्शन के लिए पैरामीटर है जहां पैरामीटर प्रकार इंटरफ़ेस है, तो एक पास में कैसे पास किया जा सकता है ऑब्जेक्ट जो इंटरफ़ेस लागू करता है।एक संदर्भ रूपांतरण, मुक्केबाजी रूपांतरण, अनबॉक्सिंग रूपांतरण, रैपिंग रूपांतरण, या शून्य प्रकार रूपांतरण

एक समारोह के लिए पैरामीटर निम्नानुसार है::

List<ICustomRequired> 

सूची है कि मैं पहले से ही इस प्रकार है: से

List<CustomObject> exampleList 

CustomObject inherits

यहाँ एक उदाहरण है ICustomRequired इंटरफ़ेस

सी क्या है पैरामीटर के रूप में exampleList पास करने के लिए सही वाक्यविन्यास?

exampleList as List<ICustomRequired> 

हालांकि मैं निम्न त्रुटि हो रही है:

Cannot convert type via a reference conversion, boxing conversion, unboxing conversion, wrapping conversion, or null type conversion

धन्यवाद

उत्तर

9

आप एक प्रकार का एक List डाली नहीं कर सकते

इस तरह मैं ऊपर काम करने के लिए सोचा है एक अलग प्रकार के List पर।

और यदि आप इसके बारे में सोचते हैं, तो आप खुश होंगे कि आप नहीं कर सकते। ,

exampleList as IEnumerable<ICustomRequired>; 

यह सुरक्षित होगा क्योंकि IEnumerable किसी के साथ आप प्रदान नहीं करता है: कहर अगर यह संभव हो गया था आप का कारण बन सकता कल्पना कीजिए:

interface ICustomRequired 
{ 
} 

class ImplementationOne : ICustomRequired 
{ 
} 

class ImplementationTwo: ICustomRequired 
{ 
} 

var listOne = new List<ImplementationOne>(); 
var castReference = listOne as List<ICustomRequired>(); 
// Because you did a cast, the two instances would point 
// to the same in-memory object 

// Now I can do this.... 
castReference.Add(new ImplementationTwo()); 

// listOne was constructed as a list of ImplementationOne objects, 
// but I just managed to insert an object of a different type 

हालांकि, ध्यान दें कि कोड की इस पंक्ति कानूनी है नई वस्तुओं को जोड़ने का मतलब है।

IEnumerable<T> वास्तव में IEnumerable<out t> के रूप में परिभाषित किया गया है, जिसका अर्थ है कि प्रकार पैरामीटर Covariant है।

क्या आप फ़ंक्शन के पैरामीटर को IEnumerable<ICustomRequired> पर बदल सकते हैं?

अन्यथा आपका एकमात्र विकल्प एक नई सूची बनाना होगा।

var newList = (exampleList as IEnumerable<ICustomRequired>).ToList(); 

या

var newList = exampleList.Cast<ICustomRequired>().ToList(); 
+0

आपके उत्तर के लिए धन्यवाद। – user3736648

0

आप ऐसा नहीं कर सकते, तो आप कन्वर्ट करने के लिए सूची

exampleList.Cast<ICustomRequired>().ToList(); 
0

List.Cast करने के लिए अतिरिक्त में है, सी # के जेनरिक Covariance and contravariance के लिए एक अच्छा समर्थन प्रदान करते हैं। इस उदाहरण से मुझे लगता है कि जिस तरह से आप मूल रूप से इरादा रखते हैं उसमें काम करने का कारण बनता है।

public class Program 
{ 
    public static void Main() 
    { 
     Foo(new List<Fim>()); 
    } 

    public static void Foo<T>(List<T> bar) where T : IFim 
    { 
     throw new NotImplementedException(); 
    } 

    public class IFim{} 
    public class Fim : IFim{} 
} 
संबंधित मुद्दे