2011-09-14 18 views
0

IList<T>の2つのタイプを比較しようとしています。両方のリストは同じTを持っているので、私は彼らが同じタイプを持つべきだと思った。一般リストのタイプの比較

Visual Studioのツールチップのデバッグモードでは、両方のタイプを読むことができ、それは同じです。

しかし、Equals() ant ==オペレーターは両方ともfalseを返します。

誰もこのweired behaviorinを説明できますか?

リトル例:

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、これは私がそれをしようとしていた方法を示しています。 List<string>IList<string>:私は

+4

あなたが実際にあなたの正確な例を試してみました:あなたの目標はあなたのタイプは、あなたが反射でそうすることができるインターフェース(すなわちIList<string>)を実装しているかどうかを判断することである場合

?私はそれが動作することを期待しています... –

+1

私は、右の行にステップするデバッガのためのコードをコンパイルする必要がありますね。 – shahkalpesh

+0

typeof(List )は、クラスの同じインスタンスへの参照を常に返します。Type – Seb

答えて

6

はい.NET 3.5を使用してい

、次の2つのタイプを比較しています。彼らは同じタイプではありません、なぜあなたはそれらが同じであることを期待するのか分かりません。

あなたがしようとしていることは不明ですが、Type.IsAssignableFromを使用するとよいでしょう。たとえば、あなたの例では、

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

がTrueを出力します。


編集前からの回答...

再現することはできません:あなたの本当のコードでは、彼らはIList<string>の両方の実装をしていることを

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 
    } 
} 

が可能ですが、 異なる実装例1はList<string>であり、他はstring[]あるので、種類が異なって表示されます

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

+0

この例は正しく動作しますが、私の編集を参照してください。 – Tokk

+0

@Tokk: "本当の"状況を示すコードは見ていません... –

+0

新しい例はほぼ現実的な状況です。ちょうど少し短くしてください。 – Tokk

2

リスト1がList<string>(type1はであるため)であり、タイプ2がtypeof(IList<string>)であるためです。通知IList<string>List<string>。どちらlist1list2は、彼らがこの上で述べたようにIList<T>

0

から派生List<T>年代、ある、IList<string>であるため、List<string>IList<string>が同じ型でないことを理由に確かです。

if (type1.GetInterfaces().Contains(typeof(IList<string>))) 
    Console.WriteLine("type1 implements IList<string>"); 
関連する問題