मैं यह नहीं समझ सकता कि निम्न 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' में परिवर्तित नहीं हो सकता
T
संदर्भ प्रकारों तक सीमित नहीं रखा है। यदि आप स्थिति का उपयोग करते हैं where T: class, IA
तो यह काम करना चाहिए। लिंक किए गए उत्तर में अधिक विवरण हैं।
Something2(foo);
सीधे-सीधे कहकर भी स्थिति को पुन: पेश कर सकते हैं। .ToList()
एक पाने के लिए चारों ओर जा रहा है List<T>
( T
जेनेरिक विधि द्वारा घोषित आपका प्रकार पैरामीटर है) इस (ए ) को समझने के लिए आवश्यक नहीं List<T>
है IEnumerable<T>
।