Подтвердить что ты не робот

Подпись метода в С#

Что такое подпись метода в следующем

int DoSomething(int a, int b);

Тип возврата является частью подписи или нет

4b9b3361

Ответ 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)