2010-05-10 24 views
9

मैं इस धारणा के तहत था कि सी # कंपाइलर एक प्रकार के आधार पर एक सरणी टाइप करेगा जिसे वे पूरी तरह से परिवर्तित कर सकते हैं।इंटरफेस को लागू करने वाले सरणी के लागू टाइपिंग

संकलक कोई सबसे अच्छा प्रकार परोक्ष टाइप सरणी के लिए मिला उत्पन्न

public interface ISomething {} 

public interface ISomething2 {} 

public interface ISomething3 {} 

public class Foo : ISomething { } 
public class Bar : ISomething, ISomething2 { } 
public class Car : ISomething, ISomething3 { } 

void Main() 
{ 
    var obj1 = new Foo(); 
    var obj2 = new Bar(); 
    var obj3 = new Car(); 

    var objects= new [] { obj1, obj2, obj3 }; 
} 

मुझे पता है कि प्रकार की तरह घोषित करने के लिए है जिस तरह से यह सही करने के लिए:

new ISomething [] { obj1, ...} 

लेकिन मैं कवर कवर के तहत मैं यहां मदद करता हूं।

+0

हो सकता है? –

उत्तर

14

सी # कंपाइलर सभी निर्दिष्ट तत्वों के प्रकारों के सेट को मानता है। यह नहीं आम आधार प्रकार आदि पर विचार करता है

आप सकता है भाव से एक डाली:

var objects= new [] { obj1, obj2, (ISomething) obj3 }; 

... लेकिन व्यक्तिगत रूप से मैं सिर्फ स्पष्ट रूप का उपयोग करेंगे:

var objects= new ISomething[] { obj1, obj2, obj3 }; 

वैकल्पिक रूप से, यदि आपने स्पष्ट रूप से obj1, obj2 और obj3 को ISomething के रूप में स्पष्ट रूप से घोषित किया है, तो वह होगा सरणी प्रारंभिक अभिव्यक्ति को बदलने के बिना भी ठीक काम करें।

सी # 3 युक्ति से, खंड 7.5.10.4:

तीसरा रूप की एक सरणी निर्माण अभिव्यक्ति में जाना जाता है एक परोक्ष टाइप किया सरणी निर्माण अभिव्यक्ति के रूप में। यह द्वितीय रूप के समान है, सिवाय इसके कि तत्व सरणी का प्रकार स्पष्ट रूप से नहीं दिया गया है, लेकिन सरणी प्रारंभकर्ता में अभिव्यक्तियों के सेट के सामान्य सामान्य प्रकार (§7.4.2.13) के रूप में निर्धारित किया गया है।

धारा 7.4.2.13 दिखता है इस तरह:

कुछ मामलों में, एक आम प्रकार करने की जरूरत है भाव का एक सेट के लिए अनुमान लगाया जा। विशेष रूप से, के तत्व प्रकारों को स्पष्ट रूप से टाइप किए गए सरणी और ब्लॉक निकायों के साथ गुमनाम कार्यों के प्रकार इस प्रकार पाए जाते हैं। Intuitively, भाव ई 1 का एक सेट दिया ... एम इस निष्कर्ष तर्क के रूप में एक विधि

Tr M<X>(X x1 … X xm) 
Ei साथ

बुला के बराबर होना चाहिए।अधिक ठीक, अनुमान बाहर एक अनिर्धारित प्रकार चर एक्स आउटपुट प्रकार अनुमान तो प्रकार एक्स अंत में, एक्स तय हो गई है के साथ प्रत्येक Ei से बना रहे हैं के साथ शुरू होता है और जिसके परिणामस्वरूप प्रकार S के लिए जिसके परिणामस्वरूप आम प्रकार है अभिव्यक्तियाँ।

3

यदि उदाहरण सभी को किसी एक उदाहरण के प्रकार में डाला जा सकता है, तो उस प्रकार का उपयोग किया जाएगा। सभी मामलों के लिए यह सामान्य नहीं है कि किसी भी प्रकार का सामान्य हो, या अन्यथा इम्प्लिसीटी सरणी प्रारंभिकता हमेशा सफल रहेगी और अक्सर अवांछित new object[] सरणी उत्पन्न करती है।

0

स्कीट के उत्तर के लिए एक मामूली इसके अलावा के रूप में:

आप किसी भी प्रकार की जरूरत है (इस मामले में इंटरफेस) को सरणी वस्तुओं में से एक डाल सकता है या यदि आप उस प्रकार के सिर्फ एक तत्व था (प्राप्त नहीं बल्कि प्रत्यक्ष प्रकार का)।

public static IWindsorInstaller[] MobileRestComponentInstallers 
     { 
      get 
      { 
       return new [] 
          { 
           new RepositoryInstaller(), 
           new AppSettingsInstaller(), 
           // tens of other installers... 
           GetLoggerInstaller() // public IWindsorInstaller GetLoggerInstaller()... 
          }; 
      } 
     } 

के रूप में इस तरह के इस काम करेंगे, लेकिन कृपया कि :) बस सरणी के प्रकार को परिभाषित और new[]new IWindsorinstaller[] को बदल नहीं करते हैं। यह सरणी प्रकार स्पष्ट रूप से परिभाषित होने के साथ और अधिक पठनीय है।

0
Do like this for Class object(UIViewController) initialization in var array: 



var page1 = new Class1(); 
var page2 = new Class2(); 
var pages = new UIViewController[] { page1, page2 }; 

नोट: यहाँ UIViewController में क्यों संकलक एक मिलान प्रकार खोजने की कोशिश नहीं करता है के रूप में किसी भी वर्ग

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