[英]T type default value
我有几种扩展方法,例如ParseInt
, ParseLong
和ParseByte
。 现在,我正在尝试为所有这些方法制作一个扩展方法。 问题是要使Default
参数成为可选参数,我必须给它一个像T Default = 0
这样的值,但它会产生错误:
类型'int'的值不能用作默认参数,因为没有标准转换为'T'类型
如果我像T Default = (T)0
这样使用它,则会收到另一个错误:
无法将类型“ int”转换为“ T”
这是我的扩展方法:
public static T Parse<T>(this string x, T Default = 0)
{
Type type = typeof(T);
if(type == typeof(int))
{ if(!string.IsNullOrEmpty(x) int.TryParse(x , out Defualt); return Default; }
}
您可以只使用default(T)
代替:
public static T Parse<T>(this string x, T defaultValue = default(T))
但是,我会在这里强烈质疑设计-您实际上并不是在编写通用方法,而是一种接受一组特定类型之一并以不同方式对待每个类型的方法。 有时您会强制执行此操作,但是我通常会使用Dictionary<T, SomeDelegate>
尝试更干净地处理它。
另外,调用int.TryParse
仍然会遇到问题-您不能将Parse<T>
的参数用作参数-您需要类似以下内容:
if (typeof(T) == typeof(int))
{
// You need to consider what you want to happen if
// int.TryParse returns false - do you want to return 0,
// or defaultValue?
int ret;
if (int.TryParse(x, out ret))
{
// Annoying but required due to which conversions are available
return (T)(object) ret;
}
}
return defaultValue;
就像已经提到的另一个答案一样,您可以通过使用default
关键字default(T)
来获取泛型类型的默认值作为编译时常量。
T
是类或接口类型,则default(T)
是空引用。 T
是一个结构,则default(T)
是所有位均为零的值。 对于数字类型,此值为0
;对于bool
为false
;对于自定义struct
,这两个规则的组合。 但是: 不要这样做。 当它仅适用于一些精选类型时, 请勿创建此通用方法 。 通常,通用方法适用于所有类型。 (您可以使用where T : …
通用参数约束来约束有效类型,但这不会改变基本思想。)
在您的情况下,通用方法仅适用于int
, long
, float
, double
, decimal
等几种类型。您甚至必须已经在通用方法中检查了这些类型,以便您可以向后推。方法( int.TryParse
, double.TryParse
等)。 这是一个很大的信号,说明您的方法根本不应该通用。
ParseInt
以前的扩展方法ParseInt
, ParseSingle
, ParseDouble
等。这是更好的设计。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.