【发布时间】:2015-10-19 01:27:14
【问题描述】:
在下面的例子中,实现类的方法有没有办法明确地告诉编译器它实现了哪个接口成员? 我知道可以解决接口之间的歧义,但这里是在一个接口中。
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
}
【问题讨论】:
-
你误解了接口。你只需要
public void Bar(string a) { }。您正在实现接口的 contract,而不是方法定义本身。当A=B对外部调用者时,两个Bar定义之间没有区别。它们是一回事。 -
我不认为你能解决这个问题,因为如果你不使用泛型就没有意义,写下没有泛型,看看会发生什么,也许它可以帮助你理解为什么不可能
-
为了进一步解释,您的界面显示“任何实现我的人都应实现
Bar(A)和Bar(B)”。当通过<string, string>时,合约变为“任何实现我的人都应该实现Bar(string)”。 -
@Rob 我不认为我误解了接口。我犯了一个设计错误,没有考虑实现类可以为 A 和 B 传递相同的类型,从而产生了这种签名冲突。我在这里问是因为希望 C# 对方法参数有一些语法方式来指示它们代表的接口参数,例如:
public void Bar(string a) where a represents IFoo::A { }但现在我确定没有,我会制作接口的方法名称独一无二。
标签: c#