为了账号安全,请及时绑定邮箱和手机立即绑定

具有泛型参数的扩展方法到泛型类

具有泛型参数的扩展方法到泛型类

C#
皈依舞 2023-04-29 10:26:28
下面的代码无法编译: 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 参数的扩展方法吗?
查看完整描述

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的类型参数。


查看完整回答
反对 回复 2023-04-29
  • 1 回答
  • 0 关注
  • 118 浏览

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信