これは闇なのでは。
ふぁ!?
入れられないの…?
うーむ、TValue
は共変の型パラメータかと思いきや、out
修飾子がついていません。
(なお TKey
は ContainsKey(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引数扱いになっています。 そのため、以下のような不便があります。
- オーバーロードの区別に使えない
- 共変・反変にできない
という制約のためだそうです。