Подпись метода в C # - PullRequest
       11

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

33 голосов
/ 10 января 2012

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

int DoSomething(int a, int b);

Возвращаемый тип является частью подписи или нет ???

Ответы [ 7 ]

68 голосов
/ 10 января 2012

Тип возвращаемого значения не является частью сигнатуры метода в C #. Только имя метода и его параметры types (но не параметр names ) являются частью подписи. Например, вы не можете использовать эти два метода:

int DoSomething(int a, int b);
string DoSomething(int a, int b);

Для ясности: методы не могут быть перегружены в зависимости от типа возвращаемого значения. Они должны иметь уникальное имя, уникальные типы параметров или передавать свои аргументы по-другому (например, используя out или ref).

Редактировать: Чтобы ответить на исходный вопрос, подпись метода для вашего метода:

DoSomething(int, int)

Обратите внимание, что все это относится к обычным методам. Если вы говорите о delegate s, то вы должны увидеть ответ клавиатурыP. (Краткая версия: возвращаемый тип является частью подписи делегата).

46 голосов
/ 10 января 2012

Является ли тип возвращаемого значения частью подписи или нет?

Это зависит от , почему вы задаете вопрос . Почему тебя это волнует?

Существует два определения сигнатуры метода. Определение языка C # не включает тип возвращаемого значения и использует сигнатуру метода, чтобы определить, разрешены ли две перегрузки. Два метода с одинаковой сигнатурой не допускаются в типе. Поскольку C # не считает возвращаемый тип частью сигнатуры, C # не позволяет двум методам, отличающимся только возвращаемым типом, быть объявленными в одном и том же типе.

CLR, однако, включает тип возвращаемого значения в подписи. CLR позволяет использовать два метода одного типа, которые отличаются только типом возвращаемого значения.

Чтобы быть более конкретным: в C # подпись состоит из методов:

  • имя
  • количество параметров типа
  • количество формальных параметров
  • тип каждого формального параметра
  • out / ref / value-ness каждого формального параметра

со следующими дополнительными примечаниями:

  • ограничения параметров универсального типа не являются частью подписи
  • тип возвращаемого значения не является частью подписи
  • параметр типа и формальные имена параметров не являются частью подписи
  • два метода могут не отличаться * только 1038 * в out / ref

В CLR подпись состоит из:

  • имя
  • количество параметров типа
  • количество формальных параметров
  • тип каждого формального параметра , включая modopts и modreqs
  • тип возврата , включая modopts и modreqs
  • ссылка / значение каждого формального параметра

Обратите внимание, что CLR вообще не делает различий между "ref int" и "out int" при рассмотрении подписей. Обратите внимание, что CLR действительно различает типы modopt / modreq. (То, как компилятор C # работает с типами modopt / modreq, слишком сложно, чтобы подвести итог.)

13 голосов
/ 10 января 2012

С MSDN :

Тип возврата метода не является частью сигнатуры метода в целях перегрузки метода.Однако он является частью сигнатуры метода при определении совместимости между делегатом и методом, на который он указывает.

Для пояснения, в вашем примере тип возвращаемого значения не является частью сигнатуры,Однако когда вы сопоставляете подпись делегата, она считается частью подписи.Начиная с MSDN :

Делегату может быть назначен любой метод, который соответствует подписи делегата , которая состоит из типа возврата и параметров .Это позволяет программно изменять вызовы методов, а также вставлять новый код в существующие классы.Пока вы знаете подпись делегата, вы можете назначить свой собственный делегированный метод.

Так что я считаю, что он основан на контексте.В большинстве случаев, как показано в вашем коде, тип возвращаемого значения не является его частью.Однако в контексте делегирования это считается частью этого.

13 голосов
/ 10 января 2012

С MSDN:

Сигнатура метода состоит из имени метода, а также типа и вида (значения, ссылки или вывода) каждого из его формальных параметров, рассматриваемых в порядке слева направо. Подпись метода специально не включает тип возвращаемого значения

Редактировать: Это из старой документации. Кажется, с тех пор определение «подписи» изменилось. Теперь метод имеет две разные сигнатуры, одну для перегрузки и одну для определения совместимости делегата. См. Ответ клавиатурыP ниже для получения более подробной информации.

5 голосов
/ 10 января 2012
DoSomething(int a, int b);

- это сигнатура метода,

int - это тип возвращаемого значения.

посмотрите на это: Подписи и перегрузка

0 голосов
/ 20 августа 2018

В случае, когда метод имеет общие аргументы, понимание подписи становится более запутанным.

Универсальные типы, объявленные на уровне класса, рассматриваются как нормальные типы.

Но универсальные типы, объявленные на уровне метода, являютсярассматривается как индекс в общих аргументах метода.

Например, все эти методы имеют разные сигнатуры.

class MyClass<TValue>
{
    public void F(TValue v) { }       // generics: 0, arg: TValue
    public void F<X>(TValue v) { }    // generics: 1, arg: TValue
    public void F<X, Y>(TValue v) { } // generics: 2, arg: TValue

    public void F<X>(X v) { }    // generics: 1, arg: 0
    public void F<X, Y>(X v) { } // generics: 2, arg: 0
    public void F<X, Y>(Y v) { } // generics: 2, arg: 1
}
0 голосов
/ 10 января 2012

Подпись не содержит тип возвращаемого значения.Ни имена параметров.В вашем случае это будет DoSomething(int, int)

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...