Универсальные методы и необязательные аргументы - PullRequest
12 голосов
/ 27 марта 2012

Можно ли написать аналогичную конструкцию?
Я хочу как-то установить значение по умолчанию для аргумента типа T.

    private T GetNumericVal<T>(string sColName, T defVal = 0)
    {
        string sVal = GetStrVal(sColName);
        T nRes;
        if (!T.TryParse(sVal, out nRes))
            return defVal;

        return nRes;
    }

Кроме того, я нашел следующую ссылку: Общий типпреобразование из строки Я думаю, этот код должен работать

private T GetNumericVal<T>(string sColName, T defVal = default(T)) where T : IConvertible
{
    string sVal = GetStrVal(sColName);
    try
    {
        return (T)Convert.ChangeType(sVal, typeof(T));
    }
    catch (FormatException)
    {
        return defVal;
    }            
}

Ответы [ 3 ]

15 голосов
/ 27 марта 2012

Я не пробовал, но изменил T defVal = 0 на T defVal = default(T)

4 голосов
/ 27 марта 2012

Чтобы ответить на вопрос, который будет работать, чтобы установить значение по умолчанию

private T GetNumericVal<T>(string sColName, T defVal = default(T)) 
{
    string sVal = GetStrVal(sColName);
    T nRes;
    if (!T.TryParse(sVal, out nRes))
        return defVal;

    return nRes;
}

Но вы не можете вызвать статический метод TryParse, так как компилятор не может знать, что тип T объявляет этот статический метод.

4 голосов
/ 27 марта 2012

Если вы знаете, что T будет иметь конструктор без параметров, вы можете использовать new T () следующим образом:

private T GetNumericVal<T>(string sColName, T defVal = new T()) where T : new()

В противном случае вы можете использовать значение по умолчанию (T)

private T GetNumericVal<T>(string sColName, T defVal = default(T))
...