2015-03-03 10 views
6

सरल कोड जो मुझे List<int> की जेनेरिक टाइप टाइप परिभाषा ICollection<> का सामान्य इंटरफ़ेस रखने की अपेक्षा करता है। फिर भी मैं List<int> से एक स्वीकार्य प्रकार प्राप्त नहीं कर सकता जो मुझे उनकी तुलना ठीक से करने की अनुमति देता है।इंटरफेस के जेनेरिक टाइप टाइप परिभाषा की तुलना

using System; 
using System.Collections.Generic; 
using System.Linq; 

public class Test 
{ 
    public static void Main() 
    { 
     var a = typeof(List<int>); 
     var b = typeof(ICollection<>); 

     var r1 = a.GetGenericTypeDefinition().GetInterfaces(); 
     foreach (var x in r1) 
     { 
      Console.WriteLine(x); 
     } 
     Console.WriteLine(); 
     Console.WriteLine(b); 
     Console.WriteLine(); 
     Console.WriteLine(r1.Any(x => x == b)); 
    } 
} 

आउटपुट

System.Collections.Generic.IEnumerable`1[T] 
System.Collections.Generic.IReadOnlyList`1[T] 
System.Collections.Generic.IReadOnlyCollection`1[T] 
System.Collections.IEnumerable 
System.Collections.Generic.IList`1[T] 
System.Collections.Generic.ICollection`1[T] 
System.Collections.ICollection 
System.Collections.IList 

System.Collections.Generic.ICollection`1[T] 

False 

मैं उम्मीद है कि r1 एक प्रकार है कि b के बराबर था निहित होगा।

संपादित

फिक्स्ड, जॉन स्कीट मुझे क्या हो रहा था में सही जानकारी दी।

using System; 
using System.Collections.Generic; 
using System.Linq; 

public class Test 
{ 
    public static void Main() 
    { 
     var a = typeof(List<int>); 
     var b = typeof(ICollection<>); 

     var r1 = a.GetInterfaces() 
      .Where(x => x.IsGenericType) 
      .Select(x => x.GetGenericTypeDefinition()); 

     foreach (var x in r1) 
     { 
      Console.WriteLine(x); 
     } 

     Console.WriteLine(); 
     Console.WriteLine(b); 
     Console.WriteLine(); 
     Console.WriteLine(r1.Contains(b)); 


    } 
} 

आउटपुट

System.Collections.Generic.IEnumerable`1[T] 
System.Collections.Generic.IReadOnlyList`1[T] 
System.Collections.Generic.IReadOnlyCollection`1[T] 
System.Collections.Generic.ICollection`1[T] 
System.Collections.Generic.IList`1[T] 

System.Collections.Generic.ICollection`1[T] 

True 

उत्तर

7

नहीं है, सामान्य प्रकार परिभाषा विशेष रूप से ICollection<T> के पास भेजेगा, जहां TIList<T> के लिए प्रकार पैरामीटर है।

कल्पना कीजिए कि आप की तरह कुछ था:

public class Foo<T1, T2> : IEnumerable<T1>, IComparable<T2> 

सामान्य प्रकार परिभाषा है कि सभी में जानकारी शामिल है - यह "जानता" है कि यह विशेष रूप से है IEnumerable<T1> और IComparable<T2>, नहीं IEnumerable<T2> और उदाहरण के लिए IComparable<T1>। ..

Console.WriteLine(r1.Any(x => x.IsGenericType && 
           x.GetGenericTypeDefinition() == b)); 
+0

धन्यवाद, आपने मुझे वह अंतर्दृष्टि दी जिसकी मुझे आवश्यकता थी। –

0

रेखा से नीचे की कोशिश

Console.WriteLine(r1.Any(x => x.Name == b.Name)); 

के बजाय

Console.WriteLine(r1.Any(x => x == b)); 
:

आप प्रकार द्वारा कार्यान्वित इंटरफेस से प्रत्येक के लिए सामान्य प्रकार परिभाषा हो रही द्वारा जाँच ठीक कर सकते हैं

+0

टाइप तुलना की सबसे सुरक्षित नहीं है। –

+0

अगर आप उदाहरण के द्वारा कुछ सीख प्रदान करते हैं तो खुशी से सहमत होंगे। – Amit

+0

जैसा कि जॉन ने अभी नाम स्ट्रिंग में टी पहचानकर्ता को इंगित किया है, वही टी नहीं है जैसा कि अन्य नाम स्ट्रिंग में है। –

संबंधित मुद्दे