具有类型约束的 C# 重载解决方案不选择我期望的方法

C# Overload Resolution with type constraint not choosing method I would expect

尽管类型约束为编译器提供了足够的信息来选择正确的重载方法签名,但执行的方法不是我预期的方法

如我所料,在没有通用方法的情况下它会调用 void DoSomething(IInterface obj)。使用通用方法,void DoSomething<T>(T obj) 被调用,因为在这种情况下出于某种原因被认为是更好的候选者。


interface IInterface
{
    void Method();  
}

class A : IInterface
{
    public void Method()
    {

    }
}

public class Program
{
    static void Gen<T>(T obj) where T : IInterface
    {
        DoSomething(obj);
    }

    static void DoSomething<T>(T obj)
    {
        Console.WriteLine("IN GENERIC DO SOMETHING");   
    }

    static void DoSomething(IInterface obj)
    {
        Console.WriteLine("IN INTERFACE DOSOMETHING");
    }

    static void DoSomething(object obj)
    {
        Console.WriteLine("IN OBJ DO SOMRTHING");
    }
    public static void Main()
    {
        IInterface i = new A();
        Gen(i);
    }
}

我希望在所有情况下都调用非泛型 DoSomething 方法,因为编译器由于约束而具有可使用的具体类型。相反,正在调用通用的 DoSomething。只有当我删除通用版本时,才会选择非通用方法。

调用泛型方法实际上是有道理的,因为它是所有三个方法中最具体的

接口和对象之一不太具体,因为它们都需要向上转换,而通用则不需要。

此外:泛型方法的思想是它的行为独立于它所特化的实际类型。特别是,运行时将只生成一个涵盖所有引用类型案例的特化。