c# - 通用扩展方法中的额外通用参数?

标签 c# generics type-inference

我想为泛型类 A 创建一个扩展方法,它采用另一个泛型类型(在此示例中为 TC),但我想这不可能吗?

class Program
{
    static void Main(string[] args)
    {
        var a = new A<B, B>();
        a.DoIt<B>();
    }
}

static class Ext
{
    public static A<TA, TB> DoIt<TA, TB, TC>(this A<TA, TB> a)
    {
        return a;
    }
}

class A<TA, TB> { }
class B { }

最佳答案

如果您可以接受轻微的语法更改,那么这是可能的。

将其更改为:

var a = new A<B, B>(); 
a.Do().It<B>(); 

诀窍在于 Do 方法是 A<TA, TB> 上的扩展方法:

public static Doer<TA, TB> Do<TA, TB>(this A<TA, TB> a)
{
    return new Doer<TA, TB>(a);
}

诀窍是这个签名让类型推断从 a 中获取 TA 和 TB这样您就不必明确指定它们。

Doer 类提供了您需要的通用方法:

public class Doer<TA, TB>
{
    public void It<TC>() { }
}

关于c# - 通用扩展方法中的额外通用参数?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/2345140/

相关文章:

java - 从嵌套泛型推断泛型类型参数

scala - 创建部分应用函数时的类型推断

c# - 用户控件和复合 Web 服务器控件

c# - WPF Dispatcher VS Winform UI 线程控制调用

c# - Assert.AreEqual 与 Assert.IsTrue/Assert.IsFalse

java - 为什么“类型绑定(bind)不匹配 : The type ? 扩展 T 不是 Enum<E> 类型的有界参数 <E extends Enum<E>> 的有效替代”?

c++ - 为什么 C++1* 仍然需要 template 关键字来代替 Full Duck Typing

generics - Rust:从(仅)<T> 不同的函数返回通用结构

c# - 匹配 1-5000 之间数字的正则表达式

inheritance - TypeScript:应该推断继承方法中的参数类型