C # Разрешение перегрузки с ограничением типа не выбирая метод, который я ожидаю - PullRequest
0 голосов
/ 18 мая 2019

Выполненный метод не тот, который я ожидал, хотя ограничение типа дает компилятору достаточно информации, чтобы выбрать правильную перегруженную сигнатуру метода

Без универсального метода он вызывает 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.Только когда я удаляю универсальную версию, выбирается неуниверсальный метод.

1 Ответ

2 голосов
/ 18 мая 2019

На самом деле имеет смысл вызывать универсальный метод, так как он является наиболее специфичным из всех трех.

Интерфейс и объектный объект менее специфичны, так как оба требуют повышения, в то время как универсальный - нет.

Более того: идея универсального метода заключается в том, что его поведение не зависит от фактического типа, с которым он специализируется. В частности, во время выполнения будет создана только одна специализация, охватывающая все случаи ссылочного типа.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...