С# Общие возвращаемые значения метода

Я просто изучаю дженерики и задаю вопрос о возвращаемых значениях метода.

Скажем, мне нужен общий метод в том смысле, что требуемая общая часть сигнатуры метода является только возвращаемым значением. Метод всегда принимает одну строку в качестве параметра, но может возвращать либо 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.

Надеюсь, что это поможет.