В универсальном методе, почему универсальная перегрузка предпочтительнее реализованного метода с родительским типом? - PullRequest
0 голосов
/ 28 июня 2019

Допустим, я создаю универсальный метод и реализую некоторые типы, как показано в коде ниже.У меня также есть два объекта: Foo и Bar, где Bar наследуется от Foo.

. Затем я реализую универсальный метод для Foo.

.Я вызываю метод с Bar, почему он не достигает перегрузки Foo метода?

Я проверил приведенный ниже код и вот что он возвращает.Меня больше интересует, почему это происходит.

Мой вопрос возникает потому, что я хочу обрабатывать Bet и Bar одинаково, поэтому тело метода будет таким же.Хотя я не могу понять, как это сделать без дублирования кода или создания другого метода, который отправляет правильный.

public class Foo 
{
}

public class Bar : Foo
{
}

public class Bet : Foo
{
}

public static string Test<T>(T generic)
{
    Console.WriteLine("T - generic overload");
    return "Generic overload";
}

public static string Test(Foo foos)
{
    Console.WriteLine("Foo - Foo overload");
    return "Foo overload";
}

void Main()
{
    Bar bar = new Bar();
    Foo foo = new Foo();

    Test(bar);
    Test(foo);
}
Returns:
T - generic overload
Foo - Foo overload

1 Ответ

2 голосов
/ 28 июня 2019

Код не соответствует вопросу.Прежде всего, object не является родителем int.Типы значений должны быть помещены в коробку для преобразования в object.Даже с ссылочными типами, предполагая, что A является родителем B, List<A> является , а не родителем List<B>.List<A> создает новый тип, который не имеет отношения наследования к List<B>.

Пример, который фактически демонстрирует вопрос:это означает, что он лучше подходит, чем Test(A)

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