问题:编写一个单一的方法声明,能够接受 List<int>
和 int[]
两种类型。
我的答案大概是这样的:
void TestMethod(object param) // 因为 object 是可以接受 int[] 和 List<int> 两种类型的基类
但这不是预期的答案,她说了。
有没有什么想法可以得到该方法签名?
IList<int>
,它同时支持 int[]
和 List<int>
:void TestMethod(IList<int> ints)
通过这种方式,您仍然可以使用索引器或Count
属性(是的,如果将其转换为IList<T>
或ICollection<T>
,数组就有一个Count
属性)。它是两种类型之间最大可能的交集,允许快速访问,使用for
循环或其他支持的方法。
请注意,即使某些方法可以被调用,例如Add
,也不支持它们,如果您在数组上使用它,将在运行时收到NotSuportedException
(“Collection was of a fixed size”)。
IList<int>
将允许您调用.Add()
方法,但如果您传递的是int[]
而不是List<int>
,则会引发运行时异常。 - Matthew WatsonLength
属性。你可以使用 array.Count()
,但那是来自 LINQ 的扩展方法。 - CorakIList<T>
--> ICollection<T>
的Count
属性。在它可见之前,你必须将其强制转换。 - Tim SchmelterIEnumerable<T>
包括更多类型)。 - Tim Schmeltervoid TestMethod(IEnumerable<int> list)
TestMethod(new int[]{1,2,3});
- Yair Nevet您的方法可以像这样:
private void SomeMethod(IEnumerable<int> values)
你可以尝试这个
private void TestMethod(dynamic param)
{
// Console.Write(param);
foreach (var item in param)
{
Console.Write(item);
}
}
TestMethod(new int[] { 1, 2, 3 });
TestMethod(new List<string>() { "x","y","y"});
public static void TestMethod<T>(IEnumerable<T> collection)
{
foreach(var item in collection)
{
Console.WriteLine(item);
}
}
int[] intArray = {1,2};
List<int> intList = new List<int>() { 1,2,3};
int[] intArray = {1,2};
List<int> intList = new List<int>() { 1,2,3};
TestMethod(intArray);
TestMethod(intList);
string[] stringArray = { "a","b","c"}
List<string> stringList = new List<string>() { "x","y","y"};
TestMethod(stringArray);
TestMethod(stringList);
void TestMethod(IEnumerable<int> param)
- MichaelCount
还是类似于数组的下标?如果是这样,请使用IList<T>
。您需要使用任何特定的方法吗?如果不需要,您可以使用object
。否则,请使用IEnumerable<int>
。 - Matthew Watson