当我有一个泛型扩展方法,与非泛型扩展方法同名时,泛型扩展方法隐藏了非泛型方法。但是,如果我在这两种情况下都使用非泛型方法,它就不会隐藏。
为什么这与常规重载不同?为什么 C# 编译器甚至在下面的情况下尝试使用 Ext1,而 IA 甚至没有从类型约束 IB 继承。C# 在查找扩展方法时是否不关心类型约束?
下面的代码甚至不会编译,因为它抱怨 A 不能隐式转换为 IB。
public interface IA {}
public interface IB {}
public interface IB1 : IB {}
public interface IB2 : IB {}
public class A : IA {}
public class B1 : IB1 {}
public class B2 : IB2 {}
public static class Ext1
{
public static string WithSomething<T>(this T builder)
where T : IB
{
return "Ext1";
}
}
public static class Ext2
{
public static string WithSomething(this IA builder)
{
return "Ext2";
}
}
[TestFixture]
public class ExtensionTests
{
[Test]
public void ShouldUseExt1()
{
var actual = new B1().WithSomething();
Assert.That(actual, Is.EqualTo("Ext1"));
}
[Test]
public void ShouldUseExt2()
{
var actual = new A().WithSomething();
Assert.That(actual, Is.EqualTo("Ext2"));
}
}