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

标签 c# generics extension-methods

<分区>

下面的代码无法编译:

 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?

类型参数推断是全有或全无:您必须在每次方法调用时指定所有类型参数,或者不指定任何类型参数。

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 推断方法 的类型参数,并且您明确指定了类型的类型参数。

关于c# - 具有泛型参数的扩展方法到泛型类,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/56704759/

相关文章:

c# - 立即窗口中的静态类方法

c# - 使用 C# 错误 "No flags can be set. Parameter name: inheritanceFlags"设置/更新文件/文件夹的继承标志权限

c# - 如何递归具有循环依赖项的项目

java - 在 Java 中延迟加载接口(interface)

c# - 参数化线程,理解lambda表达式

c# - 将 arraylist 更改为通用

java - 如何使用一种方法收集并返回具有一个泛型类型参数的实例?

c# - 修改 string.Substring

c# - RichTextBox BeginUpdate() EndUpdate() 扩展方法不起作用

swift - 如何从扩展中调用选择器?