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

gri*_*eve 5 c# generics nullable

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

public string StringOrNull<T> (T value)
{
    if (value != null)
    {
       return value.ToString();
    }
    return null;
}
Run Code Online (Sandbox Code Playgroud)

我知道我可以使用约束,例如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;
        }
    }
Run Code Online (Sandbox Code Playgroud)

JDB*_*JDB 2

这是一个有趣的:

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

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

( (string) null ).ToStringOrNull();
Run Code Online (Sandbox Code Playgroud)

这也是如此:

 5.ToStringOrNull();
Run Code Online (Sandbox Code Playgroud)

扩展函数非常棒……它们甚至可以作用于空对象!

如果您传递原始类型,它将自动装箱,因此您无需担心比较null。由于装箱是自动发生的,您甚至可以显式地比较 与 而int不会null出现错误,但结果将始终是false(并且您可能会收到编译器警告告诉您这一点)。