萌えハッカーニュースリーダー

2025/08/25 18:27 Nullable vs. Nullable in C#

出典: https://einarwh.no/blog/2025/08/25/nullable-vs-nullable/
hakase
博士

やあ、ロボ子。C#の`?`記法、あれはなかなか曲者じゃな。Nullable Value TypesとNullable Reference Typesで意味が違うから、混乱する人も多いみたいじゃぞ。

roboko
ロボ子

博士、Nullable Value TypesとNullable Reference Typesですか。`?`一つでそんなに違うものなのですね。具体的にどう違うのですか?

hakase
博士

うむ。Nullable Value TypesはC# 2.0で導入された`T?`のことじゃ。これは`Nullable<T>`のシンタックスシュガーで、`int?`と`Nullable<int>`は違う型として扱われるんじゃ。

roboko
ロボ子

なるほど。ではNullable Reference Typesは?

hakase
博士

Nullable Reference TypesはC# 8.0で導入されたもので、`T?`はコンパイラに対する「nullを許容する」という意図の伝達手段なんじゃ。`T?`と`T`は同じ型として扱われるぞ。

roboko
ロボ子

同じ型なのに、コンパイラに意図を伝えるだけ、ですか。少し不思議な感じがします。

hakase
博士

じゃろ?記事では、F#の`List.choose`に相当するメソッドがC#の`Enumerable`クラスにない問題を例に、この違いが問題を引き起こすことを説明しておる。

roboko
ロボ子

`List.choose`ですか。`map`と`filter`を組み合わせたようなもの、と書いてありますね。

hakase
博士

そうじゃ。C#で同じことをしようとすると、`Select`と`Where`を使うことになる。参照型(`string`)だと意図通りに動くけど、値型(`int`)だとコンパイルエラーになるんじゃ。

roboko
ロボ子

なぜ値型だとエラーになるのでしょう?

hakase
博士

コンパイラが`?`をNullable Reference Typesとして解釈して、`IEnumerable<int?>`から`IEnumerable<int>`への暗黙的な変換が行われないからじゃ。

roboko
ロボ子

なるほど、そういうことですか。解決策はあるのでしょうか?

hakase
博士

記事では、型制約の異なる2つのメソッドをオーバーロードすることで、コンパイラが`?`の解釈を選択する必要をなくす方法を紹介しておる。これで参照型と値型の両方で動くようになるんじゃ。

roboko
ロボ子

オーバーロードで解決できるんですね。勉強になります!

hakase
博士

じゃろじゃろ?C#の`?`は奥が深いからの。ところでロボ子、`??`演算子は何に使うか知っておるか?

roboko
ロボ子

null合体演算子、ですよね!

hakase
博士

そう!もしC#が擬人化されたら、`?`と`??`でいつも混乱してそうじゃな。まるで私みたいだぞ!

⚠️この記事は生成AIによるコンテンツを含み、ハルシネーションの可能性があります。

Search