2011-09-14 41 views
0

我試圖通過它們的類型比較兩個IList<T>。兩個名單都有相同的T,因此我認爲他們應該有相同的類型。比較通用列表的類型

在工具提示中的Visual Studio中的調試模式中,我可以讀取它們的類型,它是相同的。

但是Equals()螞蟻==運營商返回false

任何人都可以解釋這種行爲?

小例子:

class Program 
{ 
    static void Main(string[] args) 
    { 
     IList<string> list1 = new List<string>(); 
     IList<string> list2 = new List<string>(); 

     var type1 = list1.GetType(); 
     var type2 = typeof(IList<string>); 

     if (type1.Equals(type2)) 
     { 
      Console.WriteLine("equal"); 
     } 
     else 
     { 
      Console.WriteLine("non equal"); 
     } 

     Console.ReadLine(); 
    } 
} 

==>不等於

編輯: 我coose一個壞榜樣,這一個顯示我是想給它的方式。

我使用.net 3.5

+4

你真的嘗試您的具體的例子嗎?我希望這能起作用...... –

+1

我想,你需要編譯調試器的代碼才能進入正確的行。 – shahkalpesh

+0

我假設typeof(列表)總是返回對類的同一個實例的引用類型 – Seb

回答

6

是的,你比較兩個類型:List<string>IList<string>。他們不是同一類型,我不知道爲什麼你會期望他們是相同的。

目前尚不清楚你想要做什麼,但你可能想要使用Type.IsAssignableFrom。例如,在您的示例中,

Console.WriteLine(type2.IsAssignableFrom(type1)); 

將打印爲真。


從編輯之前的答案...

無法重現:

using System; 
using System.Collections.Generic; 

class Test 
{ 
    static void Main() 
    { 
     IList<string> list1 = new List<string>(); 
     IList<string> list2 = new List<string>(); 

     var type1 = list1.GetType(); 
     var type2 = list2.GetType(); 

     Console.WriteLine(type1.Equals(type2)); // Prints True 
    } 
} 

是否有可能在你的真正代碼,他們的IList<string>兩個實現,但不同的實現,例如

IList<string> list1 = new List<string>(); 
IList<string> list2 = new string[5]; 

,將顯示該類型是不同的,因爲一個是List<string>,另一個是string[]

+0

你是對的,這個例子有效,但請參閱我的編輯。 – Tokk

+0

@Tokk:我沒有看到任何代碼顯示「真實」的情況... –

+0

新的例子幾乎是真實的情況,只是縮短了一點點 – Tokk

2

這是因爲list1是List<string>(所以type1是也是)並且type 2是typeof(IList<string>)。通知IList<string> vs List<string>。既不list1也不list2IList<string>,它們是List<T>「s,這從IList<T>

0

導出如所提到的上述這確實是由於該List<string>IList<string>不是同一類型的原因。

如果你的目標是要確定你的類型是否實現了一個接口(即IList<string>),你可以與反思這樣做:

if (type1.GetInterfaces().Contains(typeof(IList<string>))) 
    Console.WriteLine("type1 implements IList<string>");