Почему перегрузка этой функции не работает? - PullRequest
0 голосов
/ 09 октября 2009

Hy, я знаю, это звучит очень глупо вопрос.
Вот что я нашел:

public static List<SomeDTO> GetData(Guid userId, int languageId)
 {
 // Do something here
 }

    public static List<int> GetData(Guid userId ,int iNumberOfItems)
    {
      var result = GetData(userID,0);

     return  (from r in result select c.id).Take(iNumberOfItems).ToList<int>();
    }

Я получаю ошибку компиляции:

ClassLibrary 'уже определяет член с именем «GetData» с такими же типами параметров Вторая возвращает только идентификаторы первой функции.

Я знаю, что это не работает.
Я знаю, что оба возвращают тип List <> , но они возвращают разные типы.
Может ли кто-нибудь объяснить мне, почему?
Как я могу решить это?

Обновление Эта проблема решена на F #!

Ответы [ 6 ]

12 голосов
/ 09 октября 2009

Вы не можете переопределить, основываясь на типе возврата. Если вы посмотрите на сигнатуру вашего метода, она выглядит следующим образом:

public static List<SomeDTO> GetData(Guid, int)

и

public static List<int> GetData(Guid, int)

Что вам нужно сделать, это одно из следующих действий:

  • Измените имена методов на более понятные.
  • Убедитесь, что параметры могут определить, какой метод вызывать

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

5 голосов
/ 09 октября 2009

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

Просто создайте два разных метода, это единственный способ обойти это.

5 голосов
/ 09 октября 2009

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

Который был бы вызван, если бы вы закодировали

object obj = GetData(Guid userId, int languageId);  ?
2 голосов
/ 09 октября 2009

Все остальные ответы здесь действительны. Ответ , который вы приняли от PatrikAkerstrand , содержит очень хорошее объяснение, почему вы получаете ошибку компиляции.

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

public static List<SomeDTO> GetData(Guid userId, int languageId)
{
  // Do something here
}
public static List<int> GetDataIds(Guid userId, int iNumberOfItems)
{
  var result = GetData(userID, 0);

  return (from r in result select c.id).Take(iNumberOfItems).ToList<int>();
}

Использование:

List<int> ids = GetDataIds(userID, 10);

Вы также можете использовать то же имя метода, но добавить параметр:

public static List<int> GetData(Guid userId, int languageId, int iNumberOfItems)
{
  var result = GetData(userID, languageId);

  return (from r in result select c.id).Take(iNumberOfItems).ToList<int>();
}

Использование:

List<int> ids = GetData(userID, 0, 10);

Методы расширения

Кроме того, вы также можете расширить List<SomeDTO>, чтобы вы могли вызывать его напрямую, если у вас уже есть заполненный список типа List<SomeDTO>:

public static List<int> GetDataIds(this List<SomeDTO> data, Guid userId, int iNumberOfItems)
{
  return (from r in data select c.id).Take(iNumberOfItems).ToList<int>();
}

Тогда вы можете использовать это так:

List<SomeDTO> result = GetData(userID, 0);

// do other stuff here using other aspects of the result...

List<int> ids = result.GetDataIds(userID, 10);
2 голосов
/ 09 октября 2009

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

Если обе функции выполняют более или менее одно и то же, вы можете решить эту проблему, создав универсальную функцию, например:

public static List<T> GetData<T>(Guid userId, int param2)

Но, похоже, это не так в вашем примере.

0 голосов
/ 09 октября 2009

Как сказал Пол Б., это потому, что тип возвращаемого значения не является частью сигнатуры, когда речь идет о перегрузке. Он видит обе функции как:

public static List<SomeDTO> GetData(Guid userId, int languageId) -> GetData(Guid, int)
public static List<int> GetData(Guid userId, int iNumberOfItems) -> GetData(Guid, int)
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...