Подтвердить что ты не робот

Общие методы и необязательные аргументы

Можно ли написать аналогичную конструкцию?
Я хочу как-то установить значение по умолчанию для аргумента типа 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;
    }

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

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;
    }            
}
4b9b3361

Ответ 1

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

Ответ 2

Если вы знаете, что T будет иметь конструктор без параметров, вы можете использовать новый 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))

Ответ 3

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

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 объявляет этот статический метод.