5

基本上我想要以下通用功能:

public string StringOrNull<T> (T value)
{
    if (value != null)
    {
       return value.ToString();
    }
    return null;
}

我知道我可以使用诸如 where T: class 之类的约束,但 T 可以是原始类型、Nullable<> 或类。有没有通用的方法来做到这一点?

编辑

原来我开枪了。这实际上工作得很好,因为这个示例显示:

    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;
        }
    }
4

4 回答 4

4

通用代码中的默认关键字

在泛型类和方法中,出现的一个问题是,当您事先不知道以下内容时,如何为参数化类型 T 分配默认值:

T 是引用类型还是值类型。

如果 T 是值类型,无论是数值还是结构。

于 2012-10-12T14:36:58.350 回答
2

您可以使用default关键字返回 T 的默认值:

public string StringOrNull<T> (T value)
{
    .....

    return default(T).ToString();
}
于 2012-10-12T14:37:51.293 回答
2

这是一个有趣的:

public static class ExtensionFunctions{
    public static string ToStringOrNull( this object target ) {
        return target != null ? target.ToString() : null;
    }
}

最酷的部分?这将起作用:

( (string) null ).ToStringOrNull();

这也会:

 5.ToStringOrNull();

扩展函数非常棒……它们甚至可以处理空对象!

如果你传递一个原始类型,它会自动被装箱,所以你不必担心null比较。由于装箱是自动发生的,您甚至可以显式比较 aint而不null出现错误,但结果将始终是false(并且您可能会收到一个编译器警告告诉您)。

于 2012-10-12T14:44:33.853 回答
1

为什么通用?

public string StringOrNull (object value)
{
    if (value != null){
       return value.ToString();
    }
    return null;
}
于 2012-10-12T14:37:02.240 回答