C#のNullableの落とし穴:T?が思ったとおりでない場合
2025-08-29
C#で、Nullable値型とNullable参照型の両方に`T?`構文を再利用することで、混乱が生じます。値型の場合、`T?`は`Nullable`のシンタックスシュガーであり、異なる型を表します。しかし、参照型の場合、`T?`は単なる意図のマーカーであり、コンパイル後には`T?`と`T`は同じ型になります。この違いは、ジェネリックメソッドを作成する際にコンパイルエラーにつながります。この記事では、F#の`List.choose`を模倣した`SelectNotNull`メソッドの例を用いて、この問題を示しています。解決策は、型制約(`where TR : class`と`where TR : struct`)を使用してメソッドをオーバーロードし、値型と参照型のあいまいさを解消することです。問題は解決しますが、設計は洗練されていないままです。
開発
Nullable型