回答:
次のジェネリックメソッドを使用します。
public static T Get<T>(T value)
{
return value;
}
のように呼び出すとGet<string>(s)
、戻り値はnull可能ではなくGet<string?>(s)
、の場合はnull可能です。
しかし、あなたのような汎用的な引数を指定して、それを呼び出している場合Get<T>(x)
と、T
例えば、それは以下のようなあなたのジェネリッククラスのジェネリック引数で、解決されません...
class MyClass<T>
{
void Method(T x)
{
var result = Get<T>(x);
// is result nullable or non-nullable? It depends on T
}
}
ここで、コンパイラーは、最終的にそれがヌル可能タイプまたは非ヌル可能タイプで呼び出されるかどうかを知りません。
T
nullにできないことを通知するために使用できる新しい型制約があります。
public static T Get<T>(T value) where T: notnull
{
return value;
}
ただし、T
が制約されておらず、まだ開いている場合、NULL可能かどうかは不明です。
これらの未知数がnull可能として扱われた場合、次のコードを書くことができます:
class MyClass<T>
{
void Method(T x)
{
var result = Get<T>(x);
// reassign result to null, cause we we could if unknown was treated as nullable
result = null;
}
}
T
null可能ではなかった場合、警告が表示されます。したがって、null許容型が不明な場合、逆参照するときに警告を表示するだけでなく、を割り当てる可能性があるという警告も表示しますnull
。