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

Car*_*erg 7 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 { }
Run Code Online (Sandbox Code Playgroud)

Mar*_*ann 5

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

将其更改为:

var a = new A<B, B>(); 
a.Do().It<B>(); 
Run Code Online (Sandbox Code Playgroud)

诀窍是 Do 方法是一个扩展方法A<TA, TB>

public static Doer<TA, TB> Do<TA, TB>(this A<TA, TB> a)
{
    return new Doer<TA, TB>(a);
}
Run Code Online (Sandbox Code Playgroud)

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

Doer 类提供了您需要的泛型方法:

public class Doer<TA, TB>
{
    public void It<TC>() { }
}
Run Code Online (Sandbox Code Playgroud)