通用方法和可选参数

Posted

技术标签:

【中文标题】通用方法和可选参数【英文标题】:Generic methods and optional arguments 【发布时间】:2012-04-11 00:51:54 【问题描述】:

可以写出类似的结构吗? 我想以某种方式为 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 我认为,这段代码必须有效

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;
                

【问题讨论】:

【参考方案1】:

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

【讨论】:

【参考方案2】:

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

【讨论】:

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

【讨论】:

是的,我不能调用 TryParse。但也许类似的东西?也许为类型参数添加一些约束(我的意思是'where:...')?如果数字类型实现了一些转换接口。 CLR 没有“虚拟静态方法”的概念,编译器无法从类型推断静态方法。据我所知,没有干净的解决方案。 ***.com/questions/196661/… 了解更多详情

以上是关于通用方法和可选参数的主要内容,如果未能解决你的问题,请参考以下文章

Python 用可变数量的位置参数和可选参数装饰方法

WinRT和可选参数发行

命名参数和可选参数,以及 WCF

Python 通用可选参数

ruby 实现Array#pad和Array#pad!。每个方法都接受最小大小(非负整数)和可选的pad值作为参数。如果是

ruby 实现Array#pad和Array#pad!。每个方法都接受最小大小(非负整数)和可选的pad值作为参数。如果是