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