以下代码无法编译:
public static class MyExtensions
{
public static Bar<M> Convert<T,M>(this Foo<T> list)
{
return new Bar<M>();
}
}
public class Program
{
static void Main(string[] args)
{
Foo<int> foo = new Foo<int>();
foo.Convert<double>();
}
}
我必须明确指定Foo的泛型类型:
foo.Convert<int, double>();
如果扩展方法具有单个通用参数,则无需在方法调用期间指定类型。
为什么?是否可以创建不需要我指定Foo参数的扩展方法?
答案 0 :(得分:4)
为什么?
类型参数推断是全部还是什么都没有:您必须在每个方法调用中指定所有类型参数,或者不指定任何类型参数。
无法推断出M
类型的参数,因为它不在参数列表中的任何地方。
一些选项:
将两个方法绑定在一起,以便第一个可以使用类型推断,第二个可以让您为M
指定类型参数:
Bar<double> bar = foo.CreateConverter() // Implicitly CreateConverter<int>
.ConvertTo<double>() // Specify that you want a Bar<double>
这将需要新的干预类型,例如Converter<T>
将返回CreateConverter
。那将有一个ConvertTo<M>
的常规实例方法。
将类型为M
的参数添加到Convert
方法中:
public static Bar<M> Convert<T, M>(this Foo<T> list, M ignored)
...然后可以按以下方式调用该方法:
Bar<double> bar = foo.Convert(default(double));
诚然,那有点臭。
不使用扩展方法,而是使用泛型中的常规静态泛型方法-该类型和方法都具有单个类型参数:
public static class Converters<M>
{
public static Bar<M> Create<T>(Foo<T> foo) { ... }
}
然后将其调用为:
Bar<double> bar = Converters<double>.Create(foo);
可以从foo
推断 method 的类型参数,而您正在明确指定 type 的类型参数。