Перегрузка с той же сигнатурой параметра - PullRequest
6 голосов
/ 01 мая 2010

В C # возможно ли иметь одинаковые параметры, но перекрывать друг друга (они различаются в типах возвращаемых данных)

public override Stocks[] Search(string Field,string Param){ //some code}
public override Stocks Search(string Field, string Param){//some code}

C # возвращает ошибку компиляции

Ответы [ 6 ]

11 голосов
/ 01 мая 2010

В C # вы можете перегружать только методы с разными сигнатурами.

Тип возвращаемого значения метода не включен в сигнатуру - только имя метода, типы и количество параметров (и их порядок). Два примера имеют одинаковую подпись, поэтому они не могут существовать вместе.

Как правило, можно вернуть список элементов (массив или другую структуру данных) - если требуется только один элемент, вы просто возвращаете список с одним элементом.

3 голосов
/ 01 мая 2010

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

public override Stocks[] Search(string Field,string Param){ //some code}
public override Stocks Search(string Field, string Param){//some code}

Подумайте об этом: как компилятор должен знать, какой вариант метода вызывать? По-видимому, это зависит от вашего результата поиска, и, очевидно, компилятор не может знать об этом заранее.

Фактически, то, что вы хотите, это одна функция, которая имеет два возможных типа возврата. То, что вы не хотите, - это два отдельных метода , потому что тогда вам придется заранее решить, какой из них вызвать. Это явно неправильный подход.

Одно из решений - всегда возвращать массив ; если найден только один объект Stocks, вы возвращаете массив размером 1.

1 голос
/ 16 марта 2012

В пути, используя несколько интерфейсов:

struct Stock { public string Symbol; public decimal Price;}
interface IByArray { Stock[] Search(string Field, string Param); }
interface IByClass { Stocks Search(string Field, string Param); }
class Stocks : IByArray, IByClass
{
    Stock[] _stocks = { new Stock { Symbol = "MSFT", Price = 32.83m } };
    Stock[] IByArray.Search(string Field, string Param)
    {
        return _stocks;
    }
    Stocks IByClass.Search(string Field, string Param)
    {
        return this;
    }
}
0 голосов
/ 01 мая 2010

Нет, вы не можете.

CLR позволяет, но по какой-то причине парни из C # решили не использовать эту функцию CLR.

0 голосов
/ 01 мая 2010

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

0 голосов
/ 01 мая 2010

Насколько я знаю, это невозможно.

Даже если это так, это излишне сложно. Просто верните массив во всех случаях (если возвращается только одно значение, то это массив Stocks [1]). Это должно сэкономить вам время, тем более что C # делает использование массивов довольно простым.

...