Es gibt ein paar Beiträge bereits auf Stack Overflow über diese Art von Sache, aber nicht genau das gleiche - so entschuldigt im Voraus, wenn dies etwas ist, das bereits beantwortet wurde.
Warum funktioniert das nicht?
public class MyBase { }
public class MyUtils
{
public bool Foo<T> (T myObject) { return true; }
public bool Foo (MyBase myBaseObject) { return false; }
public void Go<T> (IEnumerable<T> items)
{
foreach (var item in items)
{
// this test fails
Assert.IsFalse (Foo (item));
}
}
}
Wenn ich oben Go() aufrufe und eine Ladung von MyBase-Objekten übergebe, wird jeder Aufruf von Foo die generische Funktion Foo () aufrufen, die true zurückgibt.
new MyUtils ().Go (new MyBase[] { new MyBase (), new MyBase () });
Warum wird nicht stattdessen die spezielle MyBase-Version aufgerufen? Wenn ich Foo (new MyBase ()) direkt aufrufe, wird korrekt abgeleitet, welcher Aufruf zu tätigen ist. Ist dies, weil der Mangel an Kovarianz für Sammlungen in C#3, oder bin ich einfach nur dumm und nicht tun dies richtig?
Merci !
Isaac