Во-первых, это «перегрузка на основе типа возврата»:
void M(int x){...}
int M(int x){...}
string M(int x){...}
объявления недопустимы;Вы не можете перегрузить метод, основанный на типе возвращаемого значения, потому что тип возвращаемого значения не является частью подписи, и подпись должна быть уникальной.* основано на типе возврата метода.Мы также не поддерживаем это.
Причина в том, что тип возврата может быть тем, что вы пытаетесь выяснить .
M(Test());
Что такое тип возвратаиспытания?Это зависит от того, какую перегрузку мы выберем.Какую перегрузку М мы выбираем?Это зависит от типа возвращаемого значения Test.
В общем, C # спроектирован так, что каждое подвыражение имеет тип, а типы разрабатываются "изнутри" в направлении "снаружи", а не снаруживнутрь.
Примечательными исключениями являются анонимные функции, группы методов и null:
M(x=>x+1)
Какого типа x => x + 1?Это зависит от того, какая перегрузка M называется.
M(N); // N is a method group
Каков тип N?Опять же, это зависит от того, какая перегрузка M вызывается.
И так далее.В этих случаях мы делаем рассуждения «снаружи» и «внутрь».
Вывод типа, включающий лямбды, чрезвычайно сложен и труден для реализации.Мы не хотим, чтобы во всем компиляторе возникали такие же сложности и сложности.