0

当我有一个泛型扩展方法,与非泛型扩展方法同名时,泛型扩展方法隐藏了非泛型方法。但是,如果我在这两种情况下都使用非泛型方法,它就不会隐藏。

为什么这与常规重载不同?为什么 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"));
    }
}
4

0 回答 0