基本上我想要以下通用功能:
public string StringOrNull<T> (T value)
{
if (value != null)
{
return value.ToString();
}
return null;
}
我知道我可以使用约束,例如T:class,但T可以是基本类型,Nullable&lt;&gt;或类。有通用的方法吗?
修改
原来我跳了枪。这实际上工作正常,如此示例所示:
class Program
{
static void Main(string[] args)
{
int i = 7;
Nullable<int> n_i = 7;
Nullable<int> n_i_asNull = null;
String foo = "foo";
String bar = null;
Console.WriteLine(StringOrNull(i));
Console.WriteLine(StringOrNull(n_i));
Console.WriteLine(StringOrNull(n_i_asNull));
Console.WriteLine(StringOrNull(foo));
Console.WriteLine(StringOrNull(bar));
}
static private string StringOrNull<T>(T value)
{
if (value != null)
{
return value.ToString();
}
return null;
}
}
答案 0 :(得分:4)
default Keyword in Generic Code
在泛型类和方法中,出现的一个问题是,如果您事先不知道以下内容,如何为参数化类型T指定默认值:
T是引用类型还是值类型。
如果T是值类型,则它是数值还是结构。
答案 1 :(得分:2)
您可以使用default关键字返回默认值T:
public string StringOrNull<T> (T value)
{
.....
return default(T).ToString();
}
答案 2 :(得分:2)
这是一个有趣的:
public static class ExtensionFunctions{
public static string ToStringOrNull( this object target ) {
return target != null ? target.ToString() : null;
}
}
很酷的部分?这将有效:
( (string) null ).ToStringOrNull();
这样:
5.ToStringOrNull();
扩展函数非常棒......它们甚至可以处理空对象!
如果您传递基本类型,它将自动为boxed,因此您无需担心null
比较。由于自动进行装箱,您甚至可以明确地将int
与null
进行比较而不会出现错误,但结果将始终为false
(您可能会收到编译器警告,告诉您如此)。
答案 3 :(得分:1)
为什么要通用?
public string StringOrNull (object value)
{
if (value != null){
return value.ToString();
}
return null;
}