我正在尝试按类型比较两个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
答案 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>
。 list1
和list2
都不是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>");