私はこの(ダミー)コードを使った一般的な方法を持っています(はい、IListは述語を持っていますが、私のコードはIListではなく他のコレクションを使っています、とにかくこれは質問には無関係です)
static T FindThing<T>(IList collection, int id) where T : IThing, new()
{
foreach T thing in collecion
{
if (thing.Id == id)
return thing;
}
return null; // ERROR: Cannot convert null to type parameter 'T' because it could be a value type. Consider using 'default(T)' instead.
}
これによりビルドエラーが発生します
「nullは値型である可能性があるため、型パラメータ 'T'に変換できません。代わりに 'default(T)'の使用を検討してください。」
このエラーを回避できますか?
2つの選択肢
default(T)
を返します。これは、Tが参照型(またはNULL値型)の場合はnull
、int
の場合は0
、char
の場合は'\0'
などを返します( デフォルト値テーブル(C#Reference) )where T : class
制約でTを参照型になるように制限してから、通常どおりnull
を返します。return default(T);
あなただけのあなたの制約を調整することができます:
where T : class
それからnullを返すことは許されます。
ジェネリック型の最初の制約としてクラス制約を追加します。
static T FindThing<T>(IList collection, int id) where T : class, IThing, new()
あなたの他の選択肢はあなたの宣言の最後にこれを追加することです。
where T : class
where T: IList
そうすれば、nullを返すことができます。
あなたがオブジェクトを持っているなら、それから型キャストする必要があります
return (T)(object)(employee);
nullを返す必要がある場合.
return default(T);
あなたが使用できる2つのオプションは以下の通りです
return default(T);
または
where T : class, IThing
return null;
theSoftwareJediのソリューションは、
また、いくつかの値型とnull許容型を使用してアーカイブすることもできます。
static T? FindThing<T>(IList collection, int id) where T : struct, IThing
{
foreach T thing in collecion
{
if (thing.Id == id)
return thing;
}
return null;
}
エラーの推奨事項...と、ユーザーdefault(T)
またはnew T
のいずれかを実行してください。
あなたがそのルートに行くならそれが有効な一致であったことを確認するためにあなたのコードの中に比較を追加しなければならないでしょう。
そうでなければ、 "match found"の出力パラメータを検討する必要があります。
以下はNullable Enumの戻り値の実用的な例です。
public static TEnum? ParseOptional<TEnum>(this string value) where TEnum : struct
{
return value == null ? (TEnum?)null : (TEnum) Enum.Parse(typeof(TEnum), value);
}
上記の2つの答えに代わるものです。戻り値の型をobject
に変更すると、null
を返すことができ、同時にnull以外の戻り値をキャストすることができます。
static object FindThing<T>(IList collection, int id)
{
foreach T thing in collecion
{
if (thing.Id == id)
return (T) thing;
}
return null; // allowed now
}