泛型方法和可选参数

本文关键字:参数 泛型方法 | 更新日期: 2023-09-27 18:29:12

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

泛型方法和可选参数

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

如果您知道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))

回答设置默认值的问题

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