泛型类型nullable和ToString

时间:2014-09-04 06:54:07

标签: c# generics nullable tostring

在我的方法中,我想处理可以为空的整数值。

public String FormatValue(Int32? item)
{
 if (item.HasValue==false) return "";
 return item.Value.ToString("### ### ###");
}

我们不想写这个方法的Int32?Int64?和其他版本,所以我们想重构它来处理泛型类型参数:

public String FormatValue<T>(T item)
{
 if (item.HasValue==false) return ""; // ERROR: no .HasValue property
 return item.Value.ToString("### ### ###"); // ERROR: usually has no ToString() with string argument
}

我该如何处理这种情况?我试图使用"where T"子句,但没有任何成功。

4 个答案:

答案 0 :(得分:5)

首先:

public String FormatValue<T>(Nullable<T> item)
     where T : struct, IFormattable
{
   if (item.HasValue==false) return ""; 
   return item.Value.ToString("### ### ###", null /* you format provider */ );
}

您正在传递通用T作为参数,但您需要Nullable

其次: ToString()中的Nullable已经在做您需要的事情 - 您不必手动执行此操作(以防万一,您不必格式化):

int? a = null;
Console.WriteLine(a.ToString()); // outputs "", no any exception

答案 1 :(得分:2)

尝试将方法的参数定义为Nullable<T>

public String FormatValue<T>(Nullable<T> item) where T : struct
{
    return item.HasValue ? item.Value.ToString("### ### ###") : String.Empty;
}

答案 2 :(得分:2)

由于您只希望自己的方法适用于可空类型,因此将T?作为参数而不是T似乎没有问题。然后,您可以约束T:它必须实现基本整数类型实现的IFormattable

public string FormatValue<T>(T? item) where T : struct, IFormattable
{
  if (item == null) return "";
  return item.Value.ToString("### ### ###", null);
}

答案 3 :(得分:1)

使用IFormattable可能是最好的主意,但您也可以使用string.Format

public string FormatValue<T>(T? item) where T : struct
{
  return string.Format("{0:### ### ###}", item);
}