С# Общие возвращаемые значения метода
Я просто изучаю дженерики и задаю вопрос о возвращаемых значениях метода.
Скажем, мне нужен общий метод в том смысле, что требуемая общая часть сигнатуры метода является только возвращаемым значением. Метод всегда принимает одну строку в качестве параметра, но может возвращать либо double, либо int. Возможно ли это?
Фактически я хочу взять строку, проанализировать число, содержащееся внутри (которое может быть двойным или int), а затем вернуть это значение.
Спасибо.
Ответы
Ответ 1
Вы не можете вернуть либо double
, либо int
из общего метода, не возвращая ни один другой тип.
Я мог бы, например, иметь класс Foo
, и ваш общий метод анализа без каких-либо ограничений позволит сделать этот вызов:
Foo result = Parse<Foo>("111");
Лучшее, что вы можете делать с числами, ограничивает вашу функцию, позволяя использовать struct
(значения-типы).
T Parse<T>(string value) where T : struct;
Но это позволит использовать все типы номеров плюс любой другой тип значения.
Вы можете ограничить по типу интерфейса, но на double
или int
нет интерфейса INumeric
, поэтому вы застряли.
Единственное, что вы можете сделать, это выбросить исключение, если в него был передан неправильный тип, что обычно не очень удовлетворяет.
Ваш лучший подход в этом случае - отказаться от дженериков и использовать отдельно названные методы.
double ParseDouble(string value);
int ParseInteger(string value);
Но, конечно, это не поможет вам узнать дженерики. К сожалению.
Ответ 2
Что-то вроде этого?
void Main()
{
int iIntVal = ConvertTo<int>("10");
double dDoubleVal = ConvertTo<double>("10.42");
}
public T ConvertTo<T>(string val) where T: struct
{
return (T) System.Convert.ChangeType(val, Type.GetTypeCode(typeof(T)));
}
Ответ 3
Да, возможно.
Пример:
public T ParseValue<T>(String value) {
// ...
}
Ответ 4
Вы можете сделать что-то вроде...
public TResult Parse<TResult>(string parameter)
{
/* do stuff */
}
И используйте его как...
int result = Parse<int>("111");
И тогда это будет зависеть от вашей реализации в методе Parse.
Надеюсь, что это поможет.