在C#中,我可以编写一个泛型函数来返回null或将值作为字符串吗?

时间:2012-10-12 14:33:48

标签: c# generics nullable

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

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

4 个答案:

答案 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比较。由于自动进行装箱,您甚至可以明确地将intnull进行比较而不会出现错误,但结果将始终为false(您可能会收到编译器警告,告诉您如此)。

答案 3 :(得分:1)

为什么要通用?

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