2012-01-04 17 views
36

शीर्षक के अनुसार, क्या सी # 4 में टाइप-नकारात्मक बाधाओं को घोषित करना संभव है?जेनेरिक नहीं बाधा जहां टी:! IENumerable

+6

भले ही थे, तो आप एक उपयोग के मामले का वर्णन कर सकते

एक समाधान डाली इस तरह तर्क करने के लिए है? –

+1

यह देखने के लिए अजीब बात है कि आपको ऐसी आवश्यकता है। आप केवल उस प्रकार के टी के खिलाफ कोड कर सकते हैं जिसे आप जानते हैं जो वर्ग के परिवार से संबंधित है। अन्यथा जेनेरिक में आप कैसे कोड कर सकते हैं? या तो आपको इस मामले में जेनेरिक की आवश्यकता नहीं है या आपको अपने उपयोग-मामलों को संशोधित करने की आवश्यकता है। –

+2

ब्याज का उपयोग-मामला निम्नलिखित ओवरलोड को सह-अस्तित्व में रखने की अनुमति देना था 'void (टी क्या) {} '' void doIt (IENumerable क्या है) {} '- इस समय अस्पष्टता है क्योंकि' टी 'पहली विधि में' IENumerable <> 'हो सकता है (इसलिए मैं यह निर्दिष्ट करना चाहता हूं कि' टी' 'IENumerable' नहीं होना चाहिए) ... – Cel

उत्तर

36

नहीं - सी # या सीएलआर में ऐसी कोई अवधारणा नहीं है।

+0

क्या यह अवधारणा भविष्य में सी # और/या सीएलआर को लाएगी? –

+0

@RandRandom: मैंने इसके लिए किसी भी योजना के बारे में नहीं सुना है। –

0

नहीं, लेकिन इसके साथ एक "है" जाँच करने के लिए संभव हो जाएगा और फिर संभाल यह उचित रूप से ...

1

आप एक बाधा उपयोग करें ताकि आप सुनिश्चित कर सकते हैं प्रकार आप का उपयोग कुछ गुण/तरीकों है/.. आप का उपयोग करना चाहते हैं।

एक प्रकार की नकारात्मक बाधा वाली जेनेरिक कोई समझ नहीं लेता है, क्योंकि कुछ गुणों/विधियों की अनुपस्थिति जानने के लिए कोई उद्देश्य नहीं है आप का उपयोग नहीं करना चाहते हैं।

+0

स्पष्ट रूप से आपको त्रुटि प्राप्त नहीं हुई है: ## '' दोनों <<इंटरफ़ेस <जेनरिक्ट 1, जेनेरिक टाइप 2 >> 'और' <इंटरफ़ेस <जेनरिक्ट 3, जेनेरिक टाइप 4 >> 'को लागू नहीं कर सकता क्योंकि वे कुछ प्रकार पैरामीटर प्रतिस्थापन ## के लिए एकजुट हो सकते हैं। निश्चित रूप से ऐसे मामले हैं जब आप यह निर्दिष्ट करना चाहते हैं कि जेनेरिकस्टइप 2 जेनरिक्टाइप 4 –

+0

नहीं हो सकता है, मैं इसी परिदृश्य के उदाहरण को लागू करने वाले सार तत्वों की एक श्रृंखला का उपयोग कर अपने परिदृश्य के आसपास काम करने में सक्षम था, और सार वर्ग का उत्तराधिकारी .. मुझे लगता है इस तरह एक्शन और ऐसा करने पर .. –

4

जहाँ तक मुझे पता है कि ऐसा करना संभव नहीं है।

आप क्या कर सकते कुछ क्रम चेकिंग है:

इस के लिए
public bool MyGenericMethod<T>() 
{ 
    // if (T is IEnumerable) // don't do this 

    if (typeof(T).GetInterface("IEnumerable") == null) 
     return false; 

    // ... 

    return true; 
} 
+1

आप इस तरह 'is' का उपयोग नहीं कर सकते - यह परीक्षण करता है कि एक * ऑब्जेक्ट * एक प्रकार के साथ संगत है या नहीं। –

+2

आपका मतलब क्या है 'अगर (टाइपोफ (टी) == टाइपऑफ (आईनेमरेबल)) {} ' – kev

0

एक का उपयोग एक विकल्प प्रकार होगा।

public class Option<A,B> 
where A : !B 
where B : !A 
{ 
    private readonly A a; 
    private readonly B b; 

    private Option(){} 

    public Option(A a) 
    { 
     this.a = a 
    } 

    public Option(B b) 
    { 
     this.b = b 
    } 
} 

रनटाइम जांच निश्चित रूप से काम करेगी लेकिन आपको संकलन समय पर प्रकार की जांच का लाभ नहीं होगा।

void doIt<T>(IEnumerable<T> what) { } 
void doIt<T>(T whats) { } 

मैं अपवादितपहली विधि संदर्भ के लिए निम्नलिखित कोड:

doIt(new List<T>()); 

2

मैं इसी मामले टिप्पणी में उल्लेख किया है को लागू करने की कोशिश कर मेरी आत्म पाया लेकिन यह वास्तव में संदर्भ दूसरा है

doIt(new List<T>().AsEnumerable<T>()); 

डाली एक और अधिभार से छिपा हो सकता है:

void doIt<T>(List<T> whats) { 
    doIt(whats.AsEnumerable<T>()); 
} 
संबंधित मुद्दे