3
私はIOrderedEnumerableの宣言を見ていましたが、それはそれがTElement型のパラメータで共変ではないことを驚いていました。インタフェースIOrderedEnumerable <T>がTで共変しないのはなぜですか?
public interface IOrderedEnumerable<TElement> : IEnumerable<TElement>, IEnumerable
{
IOrderedEnumerable<TElement> CreateOrderedEnumerable<TKey>(Func<TElement, TKey> keySelector, IComparer<TKey> comparer, bool descending);
}
なぜそれが共変動しなかったのか?
+ 1のコードサンプルでは、メソッドのオーバーロードのために、型パラメータにIOrderedEnumerableの共変変数を設定すると問題が発生する可能性がありますが、共変にするのはかなり自然なことです。私はIEnumerableでコードサンプルをテストしました。 これは、メソッドオーバーロードと反変または一般的な分散がうまく機能しないことを意味しますか? –
@ZakaryaIsserそれは自然ですが何らかの理由で行われていません。そのサンプルがそのまま動作するのは、選択するオーバーロードを解決するときに、現在のタイプの最初のメソッドが調べられるからです。一致するメソッドが見つかると、親の型は調べられません。したがって、 'IOrderedEnumerable'が共変な場合、' Derived.DoSomething'は一致し、親( 'Base')型のオーバーロードは探索されません。共変でない場合、 'Derived.DoSomething'は一致しません。そして、オーバーロードの解決は親の型に行きます。 – Evk
@ ZakaryaIsserだから私はこれが共分散に関係していないことを意味する。 'IOrderedEnumerable