【发布时间】:2010-12-16 23:24:57
【问题描述】:
我有大量不同内置类型的对象,例如int、bool[]、double[] 等
在对象 M 上,我想对集合的每个元素执行一次 MyMethod 操作。但是,我需要对数组执行不同的操作,对单个值执行不同的操作。
首先,我尝试了:
public void MyMethod<T>(T value)
public void MyMethod<T>(T[] array)
但是,第一种方法适用于集合的每个元素,包括数组。
我的下一个尝试是:
public void MyMethod<T>(T value) where T : struct
public void MyMethod<T>(T[] array)
当我尝试调用该方法时,它产生了以下效果:
错误 8 类型“T”必须是不可为空的值类型,才能在泛型类型或方法“MyMethod(T)”中用作参数“T”
编译器似乎没有看到 MyMethod(T[] array) 方法。 我哪里错了?
最后我提供了一个辅助方法:
public void MyAux<T>(T value) {
if (value.GetType().IsArray) {
this.MyMethodForArray(value);
}
else {
this.MyMethodForSingleValue(value);
}
然后我得到一个错误:
错误 8 方法的类型参数 'MyMethodForArray(T[])' 不能 从用法推断。尝试 指定类型参数 明确的。
如何优雅地处理这个问题?
【问题讨论】:
-
我只是尝试复制相同但函数被正确调用(即传递数组的数组通用方法和非数组参数的常规版本。)
-
您的第一种方法应该可以正常工作
-
试试 MyMethod
(IEnumerable 数组) -
我没有告诉你我希望从调用中推断出类型 T。
-
我遍历将其元素作为对象类型实例处理的集合,并将它们传递给 MyMethod 调用。也许像第一个和第二个这样的方法不会成功。