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

汎用コードの default キーワード

ジェネリック クラスとジェネリック メソッドで発生する問題の 1 つは、次のことが事前にわからない場合に、パラメーター化された型 T に既定値を割り当てる方法です。

T が参照型か値型か。

T が値型の場合、数値か構造体か。

于 2012-10-12T14:36:58.350 に答える
2

ここに楽しいものがあります:

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

クールな部分?これはうまくいきます:

( (string) null ).ToStringOrNull();

これもそうです:

 5.ToStringOrNull();

拡張関数は非常に優れています... null オブジェクトでも動作します!

プリミティブ型を渡すと自動的にboxednullになるので、比較を気にする必要はありません。intボックス化は自動的に行われるため、エラーなしで明示的に とを比較することもできますnullが、結果は常に になりますfalse(おそらく、そのことを知らせるコンパイラ警告が表示されます)。

于 2012-10-12T14:44:33.853 に答える
2

defaultキーワードを使用して、T のデフォルトを返すことができます。

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

    return default(T).ToString();
}
于 2012-10-12T14:37:51.293 に答える
1

なぜジェネリック?

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