C#列表什么时候不是IEnumerable



我希望能够确定传递的参数是否是IEnumerable。

static bool TestForEnumerable(dynamic toTest)
{
return toTest is IEnumerable<Object>;
}

我写了下面的控制台应用程序来调查我遇到的一个问题。。。

static void Main(string[] args)
{
Program _program = new Program();
Console.WriteLine("");
List<TestObject> toObj = new List<TestObject>
{
new TestObject { FirstName = "James", MiddleName = "Maitland", LastName = "Stewart", DOB = new DateTime(1908, 05, 20), IsFemale = false },
new TestObject { FirstName = "Gary", MiddleName = "James", LastName = "Cooper", DOB = new DateTime(1901, 05, 07), IsFemale = false },
new TestObject { FirstName = "Archibald", MiddleName = "Alec", LastName = "Leach", AKA="Cary Grant", DOB = new DateTime(1904, 01, 18), IsFemale = false },
new TestObject { FirstName = "Erol", MiddleName = "Leslie Thompson", LastName = "Flynn", DOB = new DateTime(1909, 06, 20), IsFemale = false },
new TestObject { FirstName = "Humphrey", MiddleName = "DeForest", LastName = "Bogart", DOB = new DateTime(1899, 12, 25), IsFemale = false },
new TestObject { FirstName = "Marion", MiddleName = "Robert", LastName = "Morrison", AKA="John Wayne", DOB = new DateTime(1907, 05, 26), IsFemale = false },
};
var kvpObj = new List<KeyValuePair<string, string>>
{
new KeyValuePair<string, string>("GPC", "3"),
new KeyValuePair<string, string>("CENTRAL CONTRACT", "4"),
new KeyValuePair<string, string>("N/A", "2"),
new KeyValuePair<string, string>("--Select Item--", "-1"),
};
Console.WriteLine(String.Format("List<TestObject> is IEnumerable : {0}", TestForEnumerable(toObj)));
Console.WriteLine(String.Format("List<KeyValuePair<string, string>> is IEnumerable : {0}", TestForEnumerable(kvpObj)));
}

这次测试的结果是。。。

List<TestObject> is IEnumerable : True
List<KeyValuePair<string, string>> is IEnumerable : False

所以问题是。。。这两个列表都实现了IEnumerable。为什么KeyValuePairs列表不被认为是IEnumerable?

它不是IEnumerable<object>,因为KeyValuePair<TKey, TValue>是一种值类型(struct(,通用方差规则不允许值类型和object在类型测试期间可互换(因为需要转换装箱(。

所以:虽然它不是IEnumerable<object>,但,然而,IEnumerable是非通用意义上的。

相关内容

最新更新