Неоднозначная ошибка вызова, обе функции имеют разные типы возврата - PullRequest
1 голос
/ 24 октября 2011

У меня есть два перегруженных метода, оба называются FunctionX.Один из них возвращает логический объект, а другой - предопределенный класс с именем Logs.

Я получаю ошибку: Неоднозначный вызов между следующими методами или свойствами: 'FunctionX (string)' и 'FunctionX(string) '.

В одном из моих других методов я вызываю FunctionX (string), ожидая объект Log, но он выдает эту ошибку.Я думал, что компилятор должен был посмотреть на тип возвращаемого значения и выяснить это сам.Как я могу это исправить?

Ответы [ 7 ]

2 голосов
/ 24 октября 2011

Компилятор не может различить функции с одинаковой сигнатурой метода, кроме возвращаемого типа. И, насколько я знаю, ни один компилятор не может это строго типизировать. Вы должны каким-то образом изменить подпись. Опцией является использование универсальной функции и предоставление возвращаемого типа.

2 голосов
/ 24 октября 2011

Хотя такие языки, как Perl и Haskell поддерживают перегрузку по типу возвращаемого значения, перегрузка по типу возвращаемого значения не поддерживается большинством языков со статической типизацией.Поэтому лучше, если вы не включите эту тривиальную проблему в свой код.

Добавлено :

Другие ответы вы можете найти в предыдущем обсуждении Stackoverflow здесь:

Перегрузка функции по типу возврата?

2 голосов
/ 24 октября 2011

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

string Foo() { /* ... */ }
int Foo() { /* ... */ }

object f = Foo();

Разработчики языка должны учитывать все обстоятельства, а не только самые тривиальные.

2 голосов
/ 24 октября 2011

Вы не можете иметь более одной функции, используя одну и ту же сигнатуру, например,

string Function1(bool t)
int Function1(bool t)

Вам нужно вызывать каждую функцию разными именами или иметь разные параметры, например,

string Function1(bool t)
int Function1(bool t, int g)
1 голос
/ 24 октября 2011

Тип возврата не участвует в перегрузке в C #.

Вы можете, например:

  1. Объявить отдельные функции FunctionXToLog и FunctionXToBool
  2. FunctionX(string s, out Log logobject), FunctionX(string s, out bool value)

Просто чтобы дать вам подсказку.

0 голосов
/ 24 октября 2011

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

Следовательно, у вас возникла проблема, поскольку оба метода имеют идентичные подписи.Компилятор не использует тип возвращаемого значения или тип объекта, который назначается, чтобы определить, какой метод вызывать.

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

0 голосов
/ 24 октября 2011

Вы не можете иметь две функции с одной и той же сигнатурой, отличающиеся только возвращаемым значением!

...