通用类型可空和ToString

3
在我的方法中,我希望处理可为空的整数值。
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个回答

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
其次:Nullable中的ToString()已经实现了您需要的功能 - 您不必手动执行此操作(这是在您不需要格式化时的情况下)。
int? a = null;
Console.WriteLine(a.ToString()); // outputs "", no any exception

不,我的答案也是在你发表之后非常相似的时间发布的。我总是在发布后测试解决方案(当我不确定时),然后纠正错误。这是问题的唯一解决方案,所以不要生气它是相同的(并且有类似的错误),也不要冒犯我。 - user2160375
2
@hvd他甚至比你快一点,而他的空值检查与你的不同。 我认为这不是抄袭。 - Marwie
如果你包含了正确的版本,我确实会认为你是独立完成的,但在两个独立的答案中出现相同的错误通常是不太可能的。但如果其他人似乎认为这很可能发生在这里,那么我猜我会给你一些怀疑的机会。(顺便说一下,编辑历史记录不显示发布后前五分钟所做的更改,而该答案已在这五分钟内更改过。在这种情况下,有将它们可见的功能会很有用。) - user743382

3

既然你只需要空值类型的方法,那么将参数从T改为T?似乎并没有问题。然后你可以对T进行约束:它必须实现IFormattable,而基本整数类型确实实现了这个接口。

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

这就是我想要的一切 :) 谢谢! - Zoltan Hernyak

2

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

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

2
T 必须是一个结构体才能传递通用的 nullable - user2160375
@pwas,谢谢。我错过了它。 - Dmitry

1

使用 IFormattable 可能是最好的选择,但你也可以使用 string.Format:

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

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接