Рихтер, обобщенный метод, требуется разжевать - C#
Формулировка задачи:
Отрывок из книги:
Метод Display можно вызвать несколькими способами:
Display("Jeff");**********//*Вызывает*Display(String)
Display(123);*************//*Вызывает*Display<T>(T) - 2 cлучай
Display<String>("Aidan");*//*Вызывает*Display<T>(T)
В первом случае компилятор может вызвать либо метод Display, принимающий String, либо обобщенный метод Display заменяя T типом String). Но компилятор C# всегда выбирает явное, а не обобщенное соответствие, поэтому генерирует вызов необобщенного метода Display, получающего String.
Во втором случае компилятор не может вызвать необобщенный метод Display, получающий String, поэтому он вызывает обобщенный метод Display. Кстати, очень удачно, что компилятор всегда выбирает более явное соответствие. Ведь если бы компилятор выбрал обобщенный метод Display, тот вызвал бы метод ToString, возвращающий String, что привело бы к бесконечной рекурсии.
Здесь или недопечатка "НЕ", или я никак не могу разобраться как получится бесконечная рекурсия:
...не может вызвать необобщенный метод Display, поэтому вызывает обобщенный..... если бы компилятор выбрал обобщенный метод Display- тот вызвал бы метод ToString, возвращающий String, что привело бы к бесконечной рекурсии.
private static void Display(String s) { Console.WriteLine(s); } private static void Display<T>(T o) { **Display(o.ToString());*//*Вызывает*Display(String) }
Решение задачи: «Рихтер, обобщенный метод, требуется разжевать»
textual
Листинг программы
Display("Jeff"); // компиллятор может вызвать и обобщенный и явный метод // всегда предпочитает явный Display(123); // может вызвать только обобщенный ибо явный не доступен Display<String>("Aidan"); // может вызвать только обобщенный, так как строка и список строк - это не одно и тоже // допустим вызвал обобщенный, тогда есть строка Display(o.ToString()); // вызывает себя же, но преобразует параметр строку, следовательно, вызывает явную версию (предпочтение компилятора), и не получается рекурсии.
ИИ поможет Вам:
- решить любую задачу по программированию
- объяснить код
- расставить комментарии в коде
- и т.д