假设我们有两个不相关的接口
public interface IFirst
{
}
public interface ISecond
{
}
同时,针对每个接口进行约束的同名扩展方法。
public static class IFirstExtensions
{
public static void DoIt<TFirst>(this TFirst model)
where TFirst : IFirst
{
}
}
public static class ISecondExtensions
{
public static void DoIt<TSecond>(this TSecond model)
where TSecond : ISecond
{
}
}
当我尝试使用IFirst实例时:
IFirst first = ...;
first.DoIt();
然后我遇到了一个错误:
"CS0121 调用 'IFirstExtensions.DoIt(TFirst)' 和 'ISecondExtensions.DoIt(TSecond)' 方法或属性时不明确。"
这很奇怪。看起来这两个方法在这个作用域都是可见的。但是如果我将它们重命名,例如:
public static class IFirstExtensions
{
public static void DoFirst<TFirst>(this TFirst model)
where TFirst : IFirst
{
}
}
public static class ISecondExtensions
{
public static void DoSecond<TSecond>(this TSecond model)
where TSecond : ISecond
{
}
}
约束起作用,第二种方法不可见,导致编译错误:
IFirst first = ...;
first.DoSecond();
看起来,当检测歧义时和调用时,约束满足条件的工作方式不同。但在C#规范中,我只找到了一个与此主题严格相关的章节,描述约束如何工作。这是编译器的漏洞还是我错过了什么?