通用扩展方法隐藏非泛型方法

时间:2013-09-23 21:07:31

标签: c# .net generics

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

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

0 个答案:

没有答案