比较通用列表的类型

时间:2011-09-14 13:11:36

标签: c# .net

我正在尝试按类型比较两个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();
    }
}

==&GT;不相等

修改 我写了一个不好的例子,这个显示了我尝试的方式。

我正在使用.Net 3.5

3 个答案:

答案 0 :(得分:6)

是的,您要比较两种类型:List<string>IList<string>。它们不是同一类型,我不知道你为什么期望它们是相同的。

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

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

将打印为True。


在编辑之前回答......

无法重现:

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[]

答案 1 :(得分:2)

这是因为list1为List<string>(因此type1为typeof(List<string>)),类型2为typeof(IList<string>)。请注意IList<string> vs List<string>list1list2都不是IList<string>,它们是List<T>,来自IList<T>

答案 2 :(得分:0)

如上所述,这确实是由于List<string>IList<string>不是同一类型的原因。

如果您的目标是确定您的类型是否实现了一个界面(即IList<string>),您可以使用反射来实现:

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