我正在尝试创建一个具有以下签名的字符串扩展方法:
public static DateTime? TryParseExact(this string src, string format, IFormatProvider provider = DateTimeFormatInfo.CurrentInfo, DateTimeStyles style = DateTimeStyles.None)
{
}我得到了一个编译器错误:
“provider”的默认参数值必须是编译时常量。
在谷歌上找不到任何东西,我唯一能做的就是这样做:
public static DateTime? TryParseExact(this string src, string format, IFormatProvider provider = null, DateTimeStyles style = DateTimeStyles.None)
{
if (provider == null)
provider = DateTimeFormatInfo.CurrentInfo;
}有人知道我如何在签名中设置IFormatProvider的默认值吗?有可能吗?IFormatProvider是一个接口,所以我假设这就是问题所在。
发布于 2015-11-30 15:51:40
如何在签名中设置IFormatProvider的默认值?有可能吗?
不是的。可选参数(“默认参数”)是对语言的修改,它是在C# 4.0和Visual 2010中引入的。
为参数提供默认值不会更改该方法签名。在您的例子中,只有一个方法签名:
TryParseExact(this string src, string format, IFormatProvider provider, DateTimeStyles style);在该方法的元数据中,因此在编译的程序集中,默认值将被记录下来。任何希望使用这些默认值的调用者都将从元数据中获取这些值,并将其值编译到调用站点中。
因为这就是它的工作方式,所以默认值必须是编译时常量,因此它们可以嵌入到元数据中。
DateTimeFormatInfo.CurrentInfo不是编译时常量,它是运行时设置的对象实例.
发布于 2015-11-30 15:55:16
在本例中,我建议创建几个重载方法,其中一个方法的参数设置较少,内部设置默认值,另一个方法使用更多的参数调用:
public static DateTime? TryParseExact(this string src, string format, IFormatProvider provider, DateTimeStyles style)
{
//do stuff
}
public static DateTime? TryParseExact(this string src, string format)
{
IFormatProvider provider = DateTimeFormatInfo.CurrentInfo;
DateTimeStyles style = DateTimeStyles.None;
return TryParseExact(src, format, provider, style);
}https://stackoverflow.com/questions/34002288
复制相似问题