私が書くとき
Nullable<Nullable<DateTime>> test = null;
コンパイルエラーが発生します:
The type 'System.Datetime?' must be a non-nullable value type in order to use it as a paramreter 'T' in the generic type or method 'System.Nullable<T>'
しかしNullable<T>
、struct
そうなので、null許容ではないはずです。
だから私はこれを作成しようとしましたstruct
:
public struct Foo<T> where T : struct
{
private T value;
public Foo(T value)
{
this.value = value;
}
public static explicit operator Foo<T>(T? value)
{
return new Foo<T>(value.Value);
}
public static implicit operator T?(Foo<T> value)
{
return new Nullable<T>(value.value);
}
}
今私が書くとき
Nullable<Foo<DateTime>> test1 = null;
Foo<Nullable<DateTime>> test2 = null;
Foo<DateTime> test3 = null;
最初の行は問題ありませんが、2行目と3行目では、次の2つのコンパイルエラーが発生します。
The type 'System.DateTime?' must be a non-nullable value type in order to use it as a parameter 'T' in the generic type or method 'MyProject.Foo<T>'
(2行目のみ)
と
Cannot convert null to 'MyProject.Foo<System.DateTime?> because it is a non-nullable value type'
Foo<Nullable<DateTime>> test = new Foo<DateTime?>();
Nullable<DateTime>
の場合、どちらのイベントも機能しませんstruct
。
概念的には、なぜnull許容であるのかを理解できます。それは、私がまだ持つことができるNullable<T>
ようなものを持つことを避けます...DateTime??????????
List<List<List<List<List<DateTime>>>>>
では、なぜこの制限があり、なぜこの動作を再現できないのFoo<T>
でしょうか。この制限はコンパイラによって強制されますか、Nullable<T>
それともコードに固有ですか?
私はこの質問を読みましたが、それは不可能であると言っているだけで、基本的にそれが不可能である理由を述べている答えはありません。