C # - поведение метода, которое зависит от ожидаемого типа - PullRequest
1 голос
/ 15 мая 2009

Можно ли написать в методе C # таким образом, что когда я пишу

 String contestId = getParameter("contestId")

я получаюtestId в строке, но когда я пишу:

 int contestId = getParameter("contestId")

я получаю соревнование, разобранное в целое число?

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

Ответы [ 5 ]

15 голосов
/ 15 мая 2009

Нет, невозможно перегрузить методы исключительно на основании их типа возврата. Однако вы можете ввести общий параметр:

T getParameter<T>(string input) {
    // ... do stuff based on T ...
}

И если бы вы использовали C # 3.0, вы могли бы использовать этот метод как:

var str = getParameter<string>("contestid");
var integer = getParameter<int>("contestid");

говоря, таким образом, фактический тип только один раз.

3 голосов
/ 15 мая 2009

Одна вещь, которую вы могли бы сделать, это вернуть отдельный объект, который имеет неявные операторы преобразования как в int, так и в string. Это было бы довольно близко к тому поведению, о котором вы просите.

Я бы на практике этого не сделал. Неявные преобразования обычно доставляют больше хлопот, чем стоят.

Вместо этого добавьте универсальный параметр, как показал Мехрдад:

var str = getParameter<string>("contestid");
var integer = getParameter<int>("contestid");
1 голос
/ 15 мая 2009

Во-первых, ответ «нет», как упоминали многие. Зачем? Вы должны присвоить результат метода чему-то? Например, вы можете иметь

int getValue()
{
  return 4;
}

getValue();

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

Личное мнение здесь, но я бы предложил что-то вроде

public string getContestIdAsString(string ConetestId);

public int getContestIdAsInt(string ContestId);

Совершенно очевидно, что каждый из них делает, и вы справляетесь со своей проблемой. Если нет чего-то, чего мне не хватает.

1 голос
/ 15 мая 2009

Я предпочитаю такой подход, он хорошо читается.

Public Class ResultProxy
{
  Private Object _Obj
  Public ResultProxy(Object O)
  { _Obj = O; }

  Public T As<T>()
  { return (T)_Obj; }
}

...

Public ResultProxy getParameter("contestId")
{
// your method's code
   return new ResultProxy(YourPersonalFavorateReturnType);
}

...

String s = getParameter("contestId").As<String>();
0 голосов
/ 15 мая 2009
public T GetParameter<T>(string parameterName)
{
   //Do work
   return value
}

string contestId = getParameter<string>("contestId")
int contestId = getParameter<int>("contestId")

Это пример вашей лучшей ставки.

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