繁体   English   中英

T型默认值

[英]T type default value

我有几种扩展方法,例如ParseIntParseLongParseByte 现在,我正在尝试为所有这些方法制作一个扩展方法。 问题是要使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 ;对于boolfalse ;对于自定义struct ,这两个规则的组合。

但是: 不要这样做。 当它仅适用于一些精选类型时, 请勿创建此通用方法 通常,通用方法适用于所有类型。 (您可以使用where T : …通用参数约束来约束有效类型,但这不会改变基本思想。)

在您的情况下,通用方法仅适用于intlongfloatdoubledecimal等几种类型。您甚至必须已经在通用方法中检查了这些类型,以便您可以向后推。方法( int.TryParsedouble.TryParse等)。 这是一个很大的信号,说明您的方法根本不应该通用。

ParseInt以前的扩展方法ParseIntParseSingleParseDouble等。这是更好的设计。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM