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

在C#中,我可以编写一个泛型函数来返回null或字符串形式的值吗?,c#,generics,nullable,C#,Generics,Nullable,基本上,我需要以下通用函数: public string StringOrNull<T> (T value) { if (value != null) { return value.ToString(); } return null; } 公共字符串StringOrNull(T值) { if(值!=null) { 返回值.ToString(); } 返回null; } 我知道我可以使用诸如where T:class之类的约束,但T可以

基本上,我需要以下通用函数:

public string StringOrNull<T> (T value)
{
    if (value != null)
    {
       return value.ToString();
    }
    return null;
}
公共字符串StringOrNull(T值)
{
if(值!=null)
{
返回值.ToString();
}
返回null;
}
我知道我可以使用诸如where T:class之类的约束,但T可以是基元类型、可为null或类。有没有一种通用的方法可以做到这一点

编辑

结果是我跳了枪。正如本示例所示,这实际上效果很好:

    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;
        }
    }
类程序
{
静态void Main(字符串[]参数)
{
int i=7;
可为空的n_i=7;
可为null的n_i_asNull=null;
字符串foo=“foo”;
字符串条=空;
控制台写入线(StringOrNull(i));
控制台写入线(StringOrNull(n_i));
Console.WriteLine(StringOrNull(n_i_asNull));
控制台写入线(StringOrNull(foo));
控制台写入线(StringOrNull(bar));
}
静态私有字符串StringOrNull(T值)
{
if(值!=null)
{
返回值.ToString();
}
返回null;
}
}

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

T是引用类型还是值类型

如果T是一个值类型,它是数值还是结构。

为什么是泛型

public string StringOrNull (object value)
{
    if (value != null){
       return value.ToString();
    }
    return null;
}
您可以使用关键字返回T的默认值:

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

    return default(T).ToString();
}
公共字符串StringOrNull(T值)
{
.....
返回默认值(T).ToString();
}
这里有一个有趣的例子:

public static class ExtensionFunctions{
    public static string ToStringOrNull( this object target ) {
        return target != null ? target.ToString() : null;
    }
}
酷的部分?这将有助于:

( (string) null ).ToStringOrNull();
这也将:

 5.ToStringOrNull();
扩展功能非常棒。。。它们甚至可以处理空对象


如果您传递一个基元类型,它将自动传递,因此您不需要担心
null
比较。由于装箱是自动发生的,您甚至可以将
int
null
进行显式比较,而不会出现错误,但结果总是
false
(您可能会收到一条编译器警告告诉您这一点)。

原语是否从对象继承?@grivee-请参阅我的答案:原语(或值类型)自动装箱。它们不会从对象继承,但会自动包装在对象中,从而允许比较为null,等等。有什么问题吗?它似乎是为我编译的。@Damien_,不相信我的人,我不认为我能将一个基元类型与null进行比较。“也许我弄错了。”“格里夫:如果你试过,你会发现它管用的。”。如果你传入一个值类型,它会将其框起来,然后检查它是否为null(当然不是),然后返回它的字符串。@Chris:我的错。我有两个间接层次,被错误弄糊涂了。这对基元类型和可空类型都适用。提醒自己:该方法不会返回
t
。它返回一个
字符串
。接受扩展函数的新知识,并提醒我装箱。我应该记得的。:)