4

正直に言うと、ここで(この質問の一部として)質問されまし たが、今は別の関連する質問があります。

public class Base
{
    public void Foo(IEnumerable<string> strings)  { }
}

public class Child : Base
{
    public void Foo(IEnumerable<object> objects) { }
}


List<string> lst = new List<string>();
lst.Add("aaa");
Child c = new Child();
c.Foo(lst);

(n C#3は呼び出します:Base.Foo C#4では呼び出しますChild.Foo:)

FW4のIm!、 では、それについて話しましょう

共分散をすべて尊重して:私が書くとき (c.Foo(lst);文字 列です!)-lstIEnumerable

両方の署名が表示されます!!! しかし、それでも-それは選択しますIEnumerable<object>か?

共分散は具体的なタイプ自体よりも強いですか?

4

1 に答える 1

5

これは、共分散が強いためではなく、C#が最初に「より近い」方法を選択するためです。したがって、それはを見てChild.Foo()、それが適用可能であると判断し(共分散のおかげで)、さらには見ていないBase.Foo()

ここでの前提は、特定のタイプがより多くを「知っている」ということです。したがって、そのメソッドを最初に検討する必要があります。

C#4仕様の§7.6.5.1を参照してください。

候補メソッドのセットは、最も派生したタイプのメソッドのみを含むように削減されます。セット内のメソッドCFごとに、CはメソッドFが宣言されているタイプであり、Cの基本タイプで宣言されているすべてのメソッドがから削除されます。セット。

于 2012-05-05T12:57:35.220 に答える