c# – 如何解决多个泛型类型参数相同时出现的模糊接口方法签名

在下面的示例中,是否有一种方法可以让实现类的方法显式地告诉编译器它实现了哪个接口成员?
我知道可以解决接口之间的歧义,但这里是一个接口.

interface IFoo<A,B>
{
    void Bar(A a);
    void Bar(B b);
}

class Foo : IFoo<string, string>
{
    public void Bar(string a) { }
    public void Bar(string b) { }  // ambiguous signature
}
最佳答案
我不认为您可以通过仅使用一个接口直接解决这个问题,因为方法签名可能在某些情况下统一.

如果您真的需要此功能,我认为您将引入一个将由foo派生的新界面.

public interface IBar<T>
{
    void Bar(T t);
}

public interface IFoo<A, B> : IBar<A>
{
    void Bar(B b);
}

现在您可以显式实现两个接口:

public class Foo : IFoo<string, string>
{
    void IFoo<string, string>.Bar(string b)
    {
        Console.WriteLine("IFoo<string, string>.Bar: " + b);
    }

    void IBar<string>.Bar(string t)
    {
        Console.WriteLine("IBar<string>.Bar: " + t);
    }
}

但是如果你想使用它,你需要将你的实例转换为特殊的界面:

var foo = new Foo();
((IFoo<string, string>)foo).Bar("Hello");
((IBar<string>foo).Bar("World");

这按预期打印:

IFoo<string, string>.Bar: Hello
IBar<string>.Bar: World

希望这会对你有所帮助.我不认为还有另一种方法可以做到这一点.

可以只显式实现一个接口,这样只需要调用另一个方法就可以进行强制转换.

转载注明原文:c# – 如何解决多个泛型类型参数相同时出现的模糊接口方法签名 - 代码日志