【问题标题】: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;
    }            
}

【问题讨论】:

    标签: c# optional-arguments generic-method


    【解决方案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 没有“虚拟静态方法”的概念,编译器无法从类型推断静态方法。据我所知,没有干净的解决方案。
        猜你喜欢
        • 2012-06-19
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2019-03-08
        • 1970-01-01
        • 2015-08-22
        • 1970-01-01
        相关资源
        最近更新 更多