1 回答
TA贡献1810条经验 获得超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的类型参数。
- 1 回答
- 0 关注
- 118 浏览
添加回答
举报