2013-01-11 18 views
5

मेरे सी # कौशल कम कर रहे हैं, लेकिन मैं नहीं समझ सकता क्यों निम्नलिखित में विफल रहता है:सी # जेनरिक और इंटरफेस और सरल OO

public interface IQuotable {} 
public class Order : IQuotable {} 
public class Proxy { 
    public void GetQuotes(IList<IQuotable> list) { ... } 
} 

तो कोड इस प्रकार है:

List<Order> orders = new List<Orders>(); 
orders.Add(new Order()); 
orders.Add(new Order()); 

Proxy proxy = new Proxy(); 
proxy.GetQuotes(orders); // produces compile error 

एम आई बस कुछ गलत कर रहा है और इसे नहीं देख रहा है? चूंकि ऑर्डर लागू करने योग्य है, आदेश की एक सूची quoatables के IList के रूप में जाना होगा। मेरे पास जावा में कुछ ऐसा है और यह काम करता है, इसलिए मुझे यकीन है कि इसकी सी # ज्ञान की कमी है।

उत्तर

12

आप एक List<Order> से परिवर्तित नहीं कर सकते IList<IQuotable> पर। वे सिर्फ संगत नहीं हैं। आखिरकार, आप IQuotableIList<IQuotable> पर (या उप प्रकार) को List<Order> में जोड़ सकते हैं।

तीन विकल्प:

  • आप नेट 4 या उच्चतर का उपयोग कर रहे हैं, तो आप सहप्रसरण का उपयोग कर सकते है अगर आप के लिए आपके प्रॉक्सी-प्रक्रिया में परिवर्तन: यदि आप केवल यह केवल काम

    public void GetQuotes(IEnumerable<IQuotable> list) 
    

    निश्चित रूप से सूची में फिर से शुरू करने की जरूरत है।

  • आप GetQuotes एक बाधा के साथ सामान्य बना सकता है:

    public void GetQuotes<T>(IList<T> list) where T : IQuotable 
    
  • आप एक List<IQuotable> बना सकते हैं के साथ शुरू करने के लिए:

    List<IQuotable> orders = new List<IQuotable>(); 
    orders.Add(new Order()); 
    orders.Add(new Order()); 
    
+0

धन्यवाद! मेरी सोच हमेशा सूची थी आईएलिस्ट के ठोस कार्यान्वयन। ऑर्डर वही है (लेकिन पाठ्यक्रम के अधिक IQuotables हो सकते हैं। इसलिए जब तक मैं IQuotable के साथ IList को लागू करता हूं तब तक मैं कुछ भी विधि में पास कर सकता हूं। जाहिर है कि ऐसा नहीं है इसलिए मुझे कॉन्वर्सिस पर पढ़ना है। मैं इसका उपयोग कर रहा हूं। नेट 2 क्योंकि यह एक सीएलआर संग्रहीत प्रक्रिया है जो केवल .NET 2 लेती है। अंत में, मैंने आपके दूसरे उदाहरण का उपयोग किया है, जो मुझे लगता है, समझ में आता है और मुझे वही करता है जो मुझे चाहिए। – Daniil

9

IList कॉन्वर्स नहीं है। आप List<Order> को IList<Quotable> पर नहीं डाल सकते हैं। तब

public void GetQuotes(IEnumerable<IQuotable> quotes) 

, के माध्यम से एक सूची अमल में लाना (आप अपनी सुविधाओं की जरूरत है),:

आप GetQuotes के हस्ताक्षर को बदल सकते हैं

var list = quotes.ToList();