Перегрузка метода C # зависит от сигнатуры или количества параметров? - PullRequest
0 голосов
/ 24 января 2012

Пожалуйста, ознакомьте меня с методом C # для загрузки: зависит ли это от сигнатуры метода, типов возвращаемых данных или количества параметров? Какие изменения необходимы, чтобы сказать, что метод загружается или может быть перегружен?

Спасибо

Ответы [ 4 ]

3 голосов
/ 24 января 2012

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

Внимание, есть исключение: если метод переопределен в каком-либо классе, c # сначала пытается найти совместимую версию в переопределенном классе, а затем только смотрит на предков.,Например,

Class A
{
  public virtual void SetProperty(string value)
  {
  }     
}

Class B: Class A
{
  public override void SetProperty(object value)
  {
  }
}

Если вы выполните следующее

  var b= new B();
  b.SetProperty("hello"); // will resolve to overridden method in class B even though you have a more specific version in its parent (class A)
3 голосов
/ 24 января 2012

Это зависит от сигнатуры - это числа и типы аргументов.

Вы можете иметь разные перегрузки с одинаковым количеством параметров, но с разными типами.Например, смотрите класс Convert - множество перегрузок метода, которые принимают один аргумент, но каждая перегрузка принимает свой тип.

2 голосов
/ 24 января 2012

Метод считается перегруженным, если число параметров отличается или типы параметров различны, но не могут быть перегружены, если отличается только возвращаемый тип метода (который не будет компилироваться).

например. ниже 3 считается перегруженным, а четвертый не будет перегружен и даже не будет компилироваться, если присутствуют другие 3:

public int Add(int a, int b); // Method 1, overloaded
public int Add(int a, int b, int c); // Method 2, overloaded
public int Add(double a, double b); // Method 3,  overloaded

public double Add(double a, double b); // Method 4 (invalid, will conflict with Method 3 above)

Согласно MSDN по Signatures and overloading (C#):

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

2 голосов
/ 24 января 2012

Если вы имеете ввиду в терминах перегрузки разрешение , это зависит от:

  • Наименование метода:)
  • Количество параметров
  • Типы параметров
  • имена параметров (если вы используете именованные аргументы)
  • Независимо от того, являются ли параметры необязательными или нет
  • Количество типа параметров

С точки зрения создания перегруженных методов, имена параметров и «необязательность» не имеют значения,так, например, это недопустимо:

// Not valid: same signature
void M(int x, string y)
void M(int z, string a = "")

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

...