1. ホーム
  2. c#

[解決済み】Nullable型をジェネリックパラメータにすることは可能か?

2022-03-25 06:52:37

質問

このようなことをしたいのですが.

myYear = record.GetValueOrNull<int?>("myYear"),

一般的なパラメータとして nullable 型があることに注意してください。

このため GetValueOrNull 関数がnullを返す可能性があるため、最初に試したのはこのようなものでした。

public static T GetValueOrNull<T>(this DbDataRecord reader, string columnName)
  where T : class
{
    object columnValue = reader[columnName];

    if (!(columnValue is DBNull))
    {
        return (T)columnValue;
    }
    return null;
}

しかし、今出ているエラーは

型 'int?' は、汎用型またはメソッドのパラメータ 'T' として使用するには、参照型でなければなりません。

そうなんだ! Nullable<int>struct ! ということで、クラス制約を変更してみました。 struct を返すことができません。 null を追加しました。)

public static T GetValueOrNull<T>(this DbDataRecord reader, string columnName)
  where T : struct

では、課題です。

myYear = record.GetValueOrNull<int?>("myYear");

以下のようなエラーが発生します。

型 'int?' を汎用型またはメソッドのパラメータ 'T' として使用するには、null 値でない型である必要があります。

ジェネリックパラメータにNullable型を指定することは全く不可能なのでしょうか?

どのように解決するのですか?

戻り値のタイプを Nullable<T> そして、NULLでないパラメータを持つメソッドを呼び出します。

static void Main(string[] args)
{
    int? i = GetValueOrNull<int>(null, string.Empty);
}


public static Nullable<T> GetValueOrNull<T>(DbDataRecord reader, string columnName) where T : struct
{
    object columnValue = reader[columnName];

    if (!(columnValue is DBNull))
        return (T)columnValue;

    return null;
}