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

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

Скажем, я хочу универсальный метод в том смысле, что обязательная общая часть сигнатуры метода - это только возвращаемое значение. Метод всегда будет принимать одну строку в качестве параметра, но может возвращать либо double, либо int. Это возможно?

По сути, я хочу взять строку, проанализировать число внутри (которое может быть double или int) и затем вернуть это значение.

Благодарю.

 Joel Etherton17 янв. 2011 г., 12:28
Это было бы неэффективным использованием дженериков (если вы не делаете это исключительно для обучения). Так как вам нужно знать тип заранее, эта конкретная задача будет лучше выполняться с Convert.ToDouble или Convert.ToInt32. Метод parse не может определить тип «автоматически», просто взглянув на строку. Вам все еще нужно знать тип перед передачей строки.

Ответы на вопрос(4)

Вы могли бы сделать что-то вроде ...

   public TResult Parse<TResult>(string parameter)
    {
     /* do stuff */
    }

И используйте это как ...

int result = Parse<int>("111");

И тогда это будет зависеть от вашей реализации в методе Parse.

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

Да, это возможно.

Пример:
public T ParseValue<T>(String value) { 
    // ...
}
 MikeMalter18 июл. 2011 г., 20:55
Это было именно то, что я искал. Благодарю.
Решение Вопроса

double илиint из универсального метода без него также возвращая любой другой тип.

Я мог бы, например, иметьFoo Класс и ваш общий метод синтаксического анализа, без каких-либо ограничений, позволят сделать этот вызов:

Foo result = Parse<Foo>("111");

Лучшее, что вы можете сделать с числами - это ограничить свою функцию, позволяя толькоstruct (значения-типы), которые будут использоваться.

T Parse<T>(string value) where T : struct;

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

Вы можете ограничить тип интерфейса, но нетINumeric интерфейс наdouble или жеint так что вы застряли.

Единственное, что вы можете сделать, это выдать исключение, если передан неправильный тип, что, как правило, не очень хорошо.

В этом случае ваш лучший подход - отказаться от обобщений и использовать отдельно названные методы.

double ParseDouble(string value);
int ParseInteger(string value);

Но, конечно, это не поможет вам выучить дженерики. Сожалею.

 Darren Young17 янв. 2011 г., 12:43
Спасибо за ответ. Я хотел использовать дженерики, так как думал, что может быть эффективнее просто иметь один метод. Очевидно, что это не так, и мне будет лучше, если я продолжу использовать два метода, которые я использую в настоящее время. Благодарю.

Что-то вроде этого?

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)));
}
 Benjol18 янв. 2011 г., 11:43
Как насчетvar kvp = ConvertTo<KeyValuePair<int, List<string>>>("1, 2");? :)
 Benjol18 янв. 2011 г., 12:40
Ага. Отсутствие INumeric - настоящий облом ...
 Maxim Gueivandov18 янв. 2011 г., 12:25
@ Бенджол: Ну,System.Convert.ChangeType должен обычно терпеть неудачу. Там нет никакого способа проверить, еслиT Тип может быть преобразован во время компиляции, так как не существует общего ограничения для «простых» типов значений (struct ограничение по крайней мере не позволит использовать ссылочные типы). Поэтому мы оставим проверку типаSystem.Convert.ChangeType во время выполнения.

Ваш ответ на вопрос