IEnumerable<T1>
कोविरिएट IEnumerable<T2>
पर जांचने के लिए आम नियम क्या है?'IENumerable <T1>' को 'IENumerable <T2>' के लिए 'covariant' की जांच कैसे करें?
मैं कुछ प्रयोग किए हैं:
1.
Object Obj = "Test string";
IEnumerable<Object> Objs = new String[100];
वर्क्स क्योंकि IEnumerable<out T>
covariant है और String
विरासत Object
।
2.
interface MyInterface{}
struct MyStruct:MyInterface{}
.....
Object V = new MyStruct();
Console.WriteLine(new MyStruct() is Object); // Output: True.
IEnumerable<Object> Vs = new MyStruct[100]; // Compilation error here
MyStruct
वास्तव में एक Object
है, लेकिन यह काम नहीं करता है क्योंकि Object
संदर्भ प्रकार है और MyStruct
मूल्य प्रकार है। ठीक है, मैं यहां कुछ तर्क देखता हूं।
3.
Console.WriteLine(new MyStruct() is ValueType); // Output: "True"
ValueType V2 = new MyStruct();
IEnumerable<ValueType> Vs2 = new MyStruct[100]; // Compilation error here
काम करना चाहिए क्योंकि IEnumerable<out T>
covariant है और MyStruct
ValueType
है, लेकिन काम नहीं करता है ... ठीक है, हो सकता है MyStruct
ValueType
inheritst वास्तव में नहीं है ....
4.
MyInterface V3 = new MyStruct();
Console.WriteLine(V3 is MyInterface); // Output: "True"
IEnumerable<MyInterface> Vs3 = new MyStruct[100]; // Compilation error here
यहां तक कि इस तरह से: "MyStterface में MyStruct को परिवर्तित नहीं कर सकता"। क्या सचमे?? तुम बस यह एक पंक्ति से पहले ...
मैं आम नियम तैयार करने के लिए कोशिश की है आपने क्या किया:
public static bool IsCovariantIEnumerable(Type T1, Type T2 ){
return (T2.IsAssignableFrom(T1)) && !T2.IsValueType; // Is this correct??
}
तो, सवाल कैसे वास्तव में निर्धारित करने के लिए करता है, तो IEnumerable<T1>
IEnumerable<T2>
को covariant है ? क्या मेरा IsCovariantIEnumerable(...)
सही है? यदि हां, तो इसे जांचने का कोई आसान तरीका है? यदि नहीं, तो इसे कैसे ठीक करें?
मूल्य प्रकार केवल सह-भिन्नता का समर्थन नहीं करते हैं; यह आश्चर्यजनक नहीं होना चाहिए कि मूल्य प्रकार * विरासत * का समर्थन नहीं करते हैं। यदि आपको किसी मान प्रकार को इंटरफ़ेस और/या 'ऑब्जेक्ट' के रूप में उपयोग करने की आवश्यकता है, तो आपको इसे बॉक्स करने की आवश्यकता है - उदा। 'Array.Cast'। यह स्पष्ट नहीं है कि इसका कौन सा हिस्सा आपको समझ में नहीं आता है, बशर्ते आपके द्वारा जुड़े प्रश्नों को भी इस प्रश्न का उत्तर दें :) –
Luaan
@ लुआयन, मैं सिर्फ यह जांचने के लिए पूर्ण नियम रखना चाहता हूं कि 'IENumerable 'कोविएरिएट' IENumerable '। मुझे अभी भी यकीन नहीं है कि मेरा 'IsCovariantIEnumerable() 'फ़ंक्शन सही है या नहीं। –
Astronavigator
इंटरफेस का समर्थन करने के मामले में, ['IsAssignableFrom'] (https://msdn.microsoft.com/en-us/library/system.type.isassignablefrom (v = vs.110) .aspx)' IsSubclassOf से बेहतर कर सकता है ' – grek40