2010-08-12 8 views
9

मैं सी # करने के लिए कुछ जावा कोड पोर्टिंग हूँ में एक untyped संग्रह मिल सकता है और मैं इस पार भागा:मैं सी #

List<?> 

मैं समझता हूँ के रूप में यह इस प्रकार Unknown के List है। नतीजतन मैं अन्यत्र प्रकार को निर्देशित कर सकता हूं (रनटाइम पर? मुझे यकीन नहीं है)।

सी # में मौलिक समकक्ष क्या है?

+1

सवाल यह है; क्या यह वास्तव में एक अच्छा विचार है, या आप प्रकार की सुरक्षा के साथ बेहतर होगा? –

+5

सूची एक प्रासंगिक उत्तर नहीं है। यदि कोई विधि सूची पैरामीटर स्वीकार करती है, तो यह सूची , सूची जैसी सभी सूची प्रकारों को स्वीकार कर सकती है। यदि पैरामीटर सूची है, तो यह काम नहीं करेगा। – irreputable

+0

कुछ संदर्भ होना अच्छा लगेगा ... इस घोषणा के लिए कहां और क्या उपयोग किया जा रहा है? –

उत्तर

6

मुझे लगता है कि जावा के List<?> के लिए सबसे अच्छा मैच होगा सी # 4.0 IEnumerable<out T> आप एक विधि है कि आप से List<?> लेता है, तो List<Object> से कॉल करने और List<String> कर सकते हैं ताकि तरह:

List<Object> objList = new List<Object>(); 
List<String> strList = new List<String>(); 

doSomething(objList); //OK 
doSomething(strList); //OK 

public void doSomething(List<?> theList) { 
///Iterate through list 
} 

सी # 4.0 IEnumerable<T> इंटरफ़ेस वास्तव मेंहै, जिसका अर्थ है कि अगर, RT से प्राप्त होता है, IEnumerable<T>IEnumerable<R> से असाइन किया जा सकता है।

List<Object> objList = new List<Object>(); 
List<String> strList = new List<String>(); 

DoSomething(objList); //OK 
DoSomething(strList); //OK 

public void DoSomething<T>(IEnumerable<T> theList) { 
///Iterate through list 
} 

संपादित करें: तो सी # 4.0 उपलब्ध नहीं है, आप हमेशा वापस या तो untyped IEnumerable पर गिर सकती है

तो, तुम सब करने की है, तो अपने DoSomething में doSomething बनाने के लिए और IEnumerable<T> पैरामीटर को स्वीकार किया है या IList

+0

सी # 4.0 घोषणा-साइट भिन्नता का उपयोग करता है, जबकि जावा उपयोग साइट है। उपयोग साइट अधिक समझ में आता है जहां "रीड-राइट" इंटरफेस आम हैं। –

5

यदि आप कोई ऐसी सूची चाहते हैं जो कुछ भी पकड़ सके, तो आप List<object> या ArrayList का उपयोग कर सकते हैं।

यदि आप एक अज्ञात प्रकार वाली एक दृढ़ता से टाइप की गई सूची चाहते हैं, तो आपको एक सामान्य वर्ग या विधि बनाना चाहिए और List<T> का उपयोग करना चाहिए।

अधिक विशिष्ट सलाह के लिए, कृपया अधिक जानकारी प्रदान करें।

+0

सूची एक अज्ञात प्रकार नहीं है। यह प्रकार टी है? जावा में कुछ अलग है। – serg10

+0

@ सर्ग: यही कारण है कि मैंने कहा ** यदि **। – SLaks

0

तुम सिर्फ इस्तेमाल कर सकते हैं

List<object>

+1

यह काम नहीं करता है। 'सूची ' जावा के 'सूची ', contravariance के एक कार्यान्वयन है, जो सी # 4 अभी भी समर्थन नहीं करता –

0

मैं प्रश्नकर्ता सी # बराबर में इस

int size2(List<?> list) 
{ 
    return 2*list.size(); 
} 

List<Foo> list = ... 
size2(list); 

की तरह कुछ परिवर्तित करने के लिए चाहता है।

निम्नलिखित कोड काम नहीं करेगा, क्योंकि यह केवल List<Object> स्वीकार करते हैं, नहीं List<Foo>

int size2(List<Object> list) 
{ 
    return 2*list.size(); 
} 
+0

अपने परिदृश्य में (केवल इंटरफेस और प्रतिनिधियों के लिए) जो के बराबर नहीं है यह काम करने के लिए जा रहा है: पूर्णांक size2 (सूची सूची) { वापसी 2 * सूची। गणना; } –

1

यह IList जैसा लगता है आप जो खोज रहे हैं। यह सूची के लिए एक सामान्य इंटरफ़ेस के रूप में कहीं उल्लेख किया है, जिसका अर्थ है आप कुछ भी है कि बाहर आता डाली और सावधान रहना क्या आप में डाल करना होगा।

3

सबसे पहले,, असीम वाइल्डकार्ड पैरामिट्रीकृत प्रकार वस्तु के रूप में ही नहीं है। जेनेरिक नहीं हैं। तो ओपी के जावा उदाहरण List<?> में List<Object> जैसा नहीं है।उदाहरण के लिए, जब विरासत गैर सामान्य संग्रह के साथ बातचीत के जावा में List<?> के लिए

// Unbounded wildcard type is not the same as Object... 
List<?> unboundedList = new ArrayList<Object>(); 
List<Object> objectList = new ArrayList<Object>(); 
unboundedList = objectList; // no problems 
objectList = unboundedList; // whoops! compile time error 

केवल वास्तविक उपयोग है। यह आपको कंपाइलर से unchecked conversion चेतावनियों से बचने की अनुमति देता है।

सी # इस उपयोग के मामले में नहीं है। सी # जेनेरिक एरर का उपयोग करके लागू नहीं किया गया था। .NET में जेनेरिक और गैर-जेनेरिक संग्रहों के बीच कोई पिछड़ा संगतता नहीं है - वे मूल .net पुस्तकालयों में सह-अस्तित्व में हैं। यह जावा से अलग है जहां संग्रह एपीआई के जेनेरिक संस्करण ने जेडीके 1.5 में गैर सामान्य संस्करण को प्रतिस्थापित किया है।

इसलिए मुझे नहीं लगता कि इस निर्माण को C# में बनाना चाहते हैं, और कोई प्रत्यक्ष समकक्ष नहीं है जो उसी तरह व्यवहार करता है।