Что такое подпись метода в следующем
int DoSomething(int a, int b);
Тип возврата является частью подписи или нет
Что такое подпись метода в следующем
int DoSomething(int a, int b);
Тип возврата является частью подписи или нет
Тип возврата не является частью сигнатуры метода в С#. Только имя метода и его типы параметров (но не имена параметров) являются частью подписи. Вы не можете, например, использовать эти два метода:
int DoSomething(int a, int b);
string DoSomething(int a, int b);
Чтобы быть ясным: методы не могут быть перегружены на основе их возвращаемого типа. Они должны иметь уникальное имя, уникальные типы параметров или передавать свои аргументы по-разному (например, используя out
или ref
).
Изменить: Чтобы ответить на ваш исходный вопрос, сигнатура метода для вашего метода:
DoSomething(int, int)
Обратите внимание, что все это относится к обычным методам. Если вы говорите о delegate
s, вы должны увидеть ответ клавиатуры. (Короткая версия: тип возврата является частью подписи для делегата).
Является ли тип возврата частью подписи или нет?
Это зависит от того, почему вы задаете вопрос. Почему вас это волнует?
Существует два определения сигнатуры метода. Определение языка С# не включает тип возвращаемого значения и использует подпись метода для определения допустимости двух перегрузок. В типе не допускаются два метода с одной и той же сигнатурой. Поскольку С# не рассматривает тип возвращаемого значения как часть подписи, С# не допускает, чтобы два метода отличались только типом возвращаемого типа, который должен быть объявлен в том же типе.
Однако CLR включает тип возврата в подпись. CLR позволяет двум методам быть одного типа, которые отличаются только типом возврата.
Более конкретно: в С# подпись состоит из методов:
со следующими дополнительными примечаниями:
В CLR подпись состоит из:
Обратите внимание, что CLR не различает "ref int" и "out int" вообще при рассмотрении подписей. Обратите внимание, что CLR различает типы modopt/modreq. (То, как компилятор С# имеет дело с типами modopt/modreq, слишком сложный, чтобы суммировать здесь.)
От MSDN:
Подпись метода состоит из имени метода и типа и вида (значения, ссылки или вывода) каждого из его формальных параметров, рассмотренных в порядке слева направо. Подпись метода специально не включает тип возврата
Изменить: Это из старой документации. Похоже, с тех пор изменилось определение "подписи". Теперь метод имеет две разные подписи: одну для перегрузки и одну для определения совместимости делегатов. Подробнее см. Ниже приведенный ниже ответ на клавиатуру.
От MSDN:
Возвращаемый тип метода не является частью сигнатуры метода для целей перегрузки метода. Однако это часть подписи метода при определении совместимости между делегата и метода, на который он указывает.
Чтобы уточнить, в вашем примере тип возврата не является частью подписи. Однако, если вы согласны с подписью делегата, это считается частью подписи. Из MSDN:
Любой метод, который соответствует подписке делегата, , который состоит из тип возврата и параметры, могут быть назначены делегату. Эта позволяет программно изменять вызовы методов, а также подключите новый код к существующим классам. Пока вы знаете делегата, вы можете назначить свой собственный делегированный метод.
Поэтому я считаю, что это основано на контексте. В большинстве случаев, как показано в вашем коде, возвращаемый тип не является частью этого. Однако в контексте делегирования он считается частью этого.
DoSomething(int a, int b);
- это сигнатура метода,
int
- это возвращаемый тип.
взгляните на это: Подписи и перегрузка
Подпись не содержит тип возврата. Ни имена параметров. В вашем случае это будет DoSomething(int, int)