通用方法和可选参数
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/… 了解更多详情以上是关于通用方法和可选参数的主要内容,如果未能解决你的问题,请参考以下文章
ruby 实现Array#pad和Array#pad!。每个方法都接受最小大小(非负整数)和可选的pad值作为参数。如果是
ruby 实现Array#pad和Array#pad!。每个方法都接受最小大小(非负整数)和可选的pad值作为参数。如果是