C#में जेनेरिक के साथ सहसंयोजक विरोधाभासी समझने में समस्या




covariance contravariance (2)

मैं सिर्फ एरिक के उत्कृष्ट अंदरूनी उत्तर को उन लोगों के लिए एक कोड उदाहरण के साथ पूरक करना चाहता था जो सामान्य बाधाओं से परिचित नहीं हो सकते हैं।

Something इस तरह से हस्ताक्षर बदलें: class बाधा को पहले आना होगा

public static IList<T> Something<T>(IEnumerable<T> foo) where T : class, IA

मैं यह नहीं समझ सकता कि निम्न C # कोड क्यों संकलित नहीं करता है।

जैसा कि आप देख सकते हैं, मेरे पास एक स्थिर जेनेरिक विधि है कुछ IEnumerable<T> पैरामीटर (और T एक IA इंटरफ़ेस होने के लिए विवश है), और इस पैरामीटर को IEnumerable<IA> नहीं बदला जा सकता है।

स्पष्टीकरण क्या है? (मैं वर्कअराउंड के लिए खोज नहीं करता, बस यह समझने के लिए कि यह काम क्यों नहीं करता है)।

public interface IA { }
public interface IB : IA { }
public class CIA : IA { }
public class CIAD : CIA { }
public class CIB : IB { }
public class CIBD : CIB { }

public static class Test
{
    public static IList<T> Something<T>(IEnumerable<T> foo) where T : IA
    {
        var bar = foo.ToList();

        // All those calls are legal
        Something2(new List<IA>());
        Something2(new List<IB>());
        Something2(new List<CIA>());
        Something2(new List<CIAD>());
        Something2(new List<CIB>());
        Something2(new List<CIBD>());
        Something2(bar.Cast<IA>());

        // This call is illegal
        Something2(bar);

        return bar;
    }

    private static void Something2(IEnumerable<IA> foo)
    {
    }
}

मुझे Something2(bar) लाइन में त्रुटि मिली:

तर्क 1: 'System.Collections.Generic.List' से 'System.Collections.Generic.IEnumerable' में परिवर्तित नहीं हो सकता


त्रुटि संदेश अपर्याप्त जानकारीपूर्ण है, और यह मेरी गलती है। उसके लिए माफ़ करना।

आप जिस समस्या का सामना कर रहे हैं वह इस तथ्य का परिणाम है कि सहसंयोजक केवल संदर्भ प्रकारों पर काम करता है।

आप शायद कह रहे हैं "लेकिन IA एक संदर्भ प्रकार है" अभी। हाँ यही है। लेकिन आपने यह नहीं कहा कि T IA बराबर है । आपने कहा कि T एक प्रकार है जो IA लागू करता है , और एक मूल्य प्रकार एक इंटरफ़ेस को लागू कर सकता है । इसलिए हम नहीं जानते कि सहसंयोजक काम करेगा या नहीं, और हम इसे अस्वीकार कर देते हैं।

यदि आप कोविरियस काम करना चाहते हैं तो आपको संकलक को बताना होगा कि टाइप पैरामीटर एक संदर्भ प्रकार है जो class बाधा के साथ-साथ IA इंटरफ़ेस बाधा भी है।

त्रुटि संदेश वास्तव में कहना चाहिए कि रूपांतरण संभव नहीं है क्योंकि सहसंयोजक को संदर्भ-प्रकार-नेस की गारंटी की आवश्यकता होती है, क्योंकि यह मूलभूत समस्या है।





contravariance