LoginSignup
7
5

IReadOnlyDictionary<TKey, TValue> の TValue は共変の型パラメーターではない

Last updated at Posted at 2014-12-12

これは闇なのでは。

共変性がない.png

ふぁ!?
入れられないの…?

outついてない.png

うーむ、TValue は共変の型パラメータかと思いきや、out 修飾子がついていません。
(なお TKeyContainsKey(TKey key) があるので明らかに out は付けられない)

理由は 2 つ。

  • bool TryGetValue(TKey key, out TValue value) メソッドが定義されているから
  • IReadOnlyCollection<KeyValuePair<TKey, TValue>> および IEnumerable<KeyValuePair<TKey, TValue>> を継承するから

out パラメーターは戻り値と同じ扱いにはならない

out パラメーターで返す場合、戻り値と同じように共変性を保証することはできないのですね。

によると

C# コンパイラーとしてはin引数やout引数をref引数と区別していますが、 .NET の型システムのレベルでは実は区別がありません。 .NET 的にはin引数もout引数もref引数扱いになっています。 そのため、以下のような不便があります。

  • オーバーロードの区別に使えない
  • 共変・反変にできない

という制約のためだそうです。

参考

7
5
1

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
7
5