我希望能够确定传递的参数是否为 IEnumerable。
static bool TestForEnumerable(dynamic toTest)
{
return toTest is IEnumerable<Object>;
}
Run Code Online (Sandbox Code Playgroud)
我编写了以下控制台应用程序来调查我遇到的问题...
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)));
}
Run Code Online (Sandbox Code Playgroud)
这个测试的结果是......
List<TestObject> is IEnumerable : True
List<KeyValuePair<string, string>> is IEnumerable : False
Run Code Online (Sandbox Code Playgroud)
所以问题是......这些都是实现IEnumerable的列表。为什么 KeyValuePairs 列表不被视为 IEnumerable?
Mar*_*ell 10
不是IEnumerable<object>,因为它是KeyValuePair<TKey, TValue>值类型 ( struct),并且通用方差规则不允许值类型并且object在类型测试期间可以互换(因为需要转换 - 装箱)。
所以:虽然它不是IEnumerable<object>,但在非通用意义上它是IEnumerable。