C#泛型方法中的“方法'ToString'没有重载需要1个参数”
c#
我正在尝试编写一个 C# 通用方法,它接受可为空的十进制和双精度值并将它们转换为字符串表示形式。
尽管我正在访问.Value可空参数,但我收到错误“方法 'ToString' 没有重载需要 1 个参数” 。
这是我的代码。我究竟做错了什么?
public static string ToThousandSeparated<T>(T? value, string naString = "") where T : struct
{
if (value.HasValue)
{
T val = value.Value;
return val.ToString("N0");
}
return naString;
}
回答
object只定义方法string ToString()(不带参数)。对象像Int32定义自己的string ToString(string)方法。
但是,有一个名为 的有用接口IFormattable,它提供了一个string ToString(string, IFormatProvider)方法。因此,您可以将自己限制在所有T实现中IFormattable:
public static string ToThousandSeparated<T>(T? value, string naString = "")
where T : struct, IFormattable
{
if (value.HasValue)
{
T val = value.Value;
return val.ToString("N0", null);
}
return naString;
}
或接受任何东西,但测试它是否IFormattable在运行时实现:
public static string ToThousandSeparated<T>(T? value, string naString = "")
where T : struct
{
if (value.HasValue)
{
T val = value.Value;
return val is IFormattable formattable ? formattable.ToString("N0", null) : val.ToString();
}
return naString;
}