将泛型参数扩展为泛型 Class
Extension Method With Generic Parameter To Generic Class
以下代码无法编译:
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 参数的扩展方法吗?
Why?
类型参数推断是全有或全无:您必须在每次方法调用时指定所有类型参数,或其中的 none 个。
无法推断 M
类型参数,因为它没有出现在参数列表中的任何位置。
几个选项:
将两个方法链接在一起,这样第一个可以使用类型推断,第二个可以让你为 M
:
指定类型参数
Bar<double> bar = foo.CreateConverter() // Implicitly CreateConverter<int>
.ConvertTo<double>() // Specify that you want a Bar<double>
这将需要一个新的干预类型,例如Converter<T>
将由 CreateConverter
返回。那将有一个 ConvertTo<M>
.
的常规实例方法
在Convert
方法中添加一个M
类型的参数:
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
推断出来,并且您正在为类型[=54]指定类型参数=] 明确地。
以下代码无法编译:
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 参数的扩展方法吗?
Why?
类型参数推断是全有或全无:您必须在每次方法调用时指定所有类型参数,或其中的 none 个。
无法推断 M
类型参数,因为它没有出现在参数列表中的任何位置。
几个选项:
将两个方法链接在一起,这样第一个可以使用类型推断,第二个可以让你为
指定类型参数M
:Bar<double> bar = foo.CreateConverter() // Implicitly CreateConverter<int> .ConvertTo<double>() // Specify that you want a Bar<double>
这将需要一个新的干预类型,例如
Converter<T>
将由CreateConverter
返回。那将有一个ConvertTo<M>
. 的常规实例方法
在
Convert
方法中添加一个M
类型的参数: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
推断出来,并且您正在为类型[=54]指定类型参数=] 明确地。