13

是否可以编写类似的结构?
我想以某种方式为 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;
    }

此外,我发现以下链接: Generic type conversion FROM string
I think, this code must work

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

3 回答 3

18

我没有尝试过,但T defVal = 0改为T defVal = default(T)

于 2012-03-27T13:28:26.700 回答
5

如果您知道 T 将有一个无参数构造函数,则可以这样使用 new T() :

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

否则你可以使用 default(T)

private T GetNumericVal<T>(string sColName, T defVal = default(T))
于 2012-03-27T13:29:38.833 回答
4

回答可以设置默认值的问题

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 声明了这个静态方法。

于 2012-03-27T13:33:53.750 回答