猿问

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

下面的代码无法编译:


 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 参数的扩展方法吗?


皈依舞
浏览 119回答 1
1回答

蝴蝶不菲

为什么?类型参数推断是全有或全无:您必须在每次方法调用时指定所有类型参数,或不指定任何类型参数。M无法推断类型参数,因为它不会出现在参数列表中的任何位置。几个选项:将两个方法链接在一起,以便第一个可以使用类型推断,第二个可以让您为 指定类型参数M:Bar<double> bar = foo.CreateConverter()&nbsp; &nbsp;// Implicitly CreateConverter<int>&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;.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>{&nbsp; &nbsp; public static Bar<M> Create<T>(Foo<T> foo) { ... }}然后将其调用为:Bar<double> bar = Converters<double>.Create(foo);该方法的类型参数可以从 中推断出来,并且您正在显式指定类型foo的类型参数。
随时随地看视频慕课网APP
我要回答