13

इस कोड:Resharper का कहना है, "स्ट्रिंग [] से ऑब्जेक्ट [] से सह-संस्करण सरणी रूपांतरण [] इस कोड के साथ" लिखने के संचालन पर रन-टाइम अपवाद का कारण बन सकता है?

comboBoxMonth.Items.AddRange(UsageRptConstsAndUtils.months.ToArray()); 

public static List<String> months = new List<String> 
{ 
    "Jan", 
    "Feb", 
    "Mar", 
    "Apr", 
    "May", 
    "Jun", 
    "Jul", 
    "Aug", 
    "Sep", 
    "Oct", 
    "Nov", 
    "Dec" 
}; 

आर # कृपण की तरह शिकायत के साथ बदल जाता है, "[] स्ट्रिंग से सह-संस्करण सरणी रूपांतरण [] आपत्ति उठाने लिखने संचालन पर रन-टाइम अपवाद पैदा कर सकता है"।

असल में, यह कोड पूरी तरह से काम करता है - कॉम्बो बॉक्स महीने के मूल्यों के साथ आबादी वाला है; Resharper के बारे में क्या है, और मैं इसके संदेहों को समझाने के लिए क्या कर सकता हूँ?

यदि यह सामान्य बात है कि सामान्य सूची में खराब डेटा हो सकता है, तो मैं इसके बारे में चिंता नहीं करूंगा - और यदि कोई समस्या हो, तो समस्या को ट्रैक करने के लिए यह आसान होगा।

+2

मुझे लगता है कि इसके आसपास जाने का एक तरीका 'सूची ' सूची ''के बजाय' सूची 'का उपयोग करना होगा। –

उत्तर

21

विधि comboBoxMonth.Items.AddRangeobject[] पैरामीटर की अपेक्षा करता है। months.ToArray()string[] है। string[] से object[] पर एक कास्ट मान्य है, लेकिन यदि विधि सरणी के तत्वों को संशोधित करने का प्रयास करती है, तो आपको रन-टाइम त्रुटियां मिलेंगी। इस मामले में ऐसा नहीं होता है, इसलिए आप चेतावनी को अनदेखा कर सकते हैं।

यह आप गुस्सा दिलाती हैं, तो आप ToArray<object>()

comboBoxMonth.Items.AddRange(UsageRptConstsAndUtils.months.ToArray<object>()); 

उपयोग कर सकते हैं यह object[] वापस आ जाएगी और कोई कलाकारों की जरूरत पड़ेगी।

+1

* यदि कोई विधि सरणी के तत्वों को संशोधित करने का प्रयास करती है * से आपका क्या मतलब है? सरणी में पहले से मौजूद तत्व को संशोधित करना कोई समस्या नहीं होनी चाहिए। –

+2

@YuvalItzchakov: यदि विधि ऑब्जेक्ट्स की एक सरणी में से एक तत्व को केले को असाइन करने का प्रयास करती है जो वास्तव में तारों की एक सरणी है, तो रनटाइम में विफलता होगी। लोग उचित रूप से उम्मीद करते हैं कि वस्तुओं की एक सरणी में केले को असाइन करना सफल होगा, लेकिन ऐसा नहीं हो सकता है। –

+0

@EricLippert हाँ, मैं समझता हूं, और यही वह था जो मैंने अपने जवाब में व्यक्त करने की कोशिश की। लेकिन मुझे लगता है कि वाक्य में अस्पष्टता है जो बताती है कि मौजूदा तत्वों को संशोधित करने से रन-टाइम अपवाद –

13

एक उदाहरण समस्या प्रदर्शित करने के लिए:

void Main() 
{ 
    Animal[] animals = new Girafee[2]; 
    animals[0] = new Zebra(); 
} 

public class Animal { } 
public class Girafee : Animal { } 
public class Zebra : Animal { } 

यह रन-टाइम में एक ArrayTypeMismatchException फेंक देते हैं।

आर # मूल रूप से तथ्य यह है कि आप एक object[] है, जो पूरी तरह से संकलक द्वारा अनुमति दी है के लिए एक string[] बताए रहे हैं की एक संभावित समस्या के आप इशारा कर रहा है, लेकिन, एक वस्तु अगर एक रन-टाइम अपवाद को जन्म दे सकती है जो एक ही बेस क्लास को साझा करता है, जिसकी सरणी पहले से ही एक अलग प्रकार के लिए इंगित की जाती है (जैसा कि मेरे उदाहरण में, हम वास्तव में एक गीराफी सरणी को इंगित करते हैं)। ऐरे सह-भिन्नता इस अर्थ में टूटी हुई है कि यह आपको जेनरिक के साथ प्राप्त संकलन-समय सुरक्षा के साथ आपूर्ति नहीं करती है। Covariance and Contravariance in C#, Part Two: Array Covariance में इस बारे में

एरिक Lippert वार्ता:

दुर्भाग्य से, सहप्रसरण के इस विशेष प्रकार टूटी हुई है। यह सीएलआर में जोड़ा गया क्योंकि जावा को इसकी आवश्यकता है और सीएलआर डिजाइनर जावा-जैसी भाषाओं का समर्थन करने में सक्षम होने के लिए चाहते थे। इसके बाद हमने इसे सी # में जोड़ा क्योंकि यह सीएलआर में था। यह निर्णय पर काफी विवादास्पद था और मैं इसके बारे में बहुत खुश नहीं हूं, लेकिन कुछ भी नहीं है हम अब इसके बारे में कर सकते हैं।

यह क्यों टूटा हुआ है? क्योंकि जानवरों की एक सरणी में एक कछुए डालना हमेशा कानूनी होना चाहिए। भाषा में सरणी covariance और रनटाइम के साथ आप गारंटी नहीं दे सकते कि जानवरों की एक सरणी कछुए स्वीकार कर सकती है क्योंकि बैकिंग स्टोर वास्तव में Giraffes की सरणी हो सकती है।

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