class A {}
class B : A {}
public void SomeFunction()
{
var someListOfB = new List<B>();
someListOfB.Add(new B());
someListOfB.Add(new B());
someListOfB.Add(new B());
SomeFunctionThatTakesA(someListOfB);
}
public void SomeFunctionThatTakesA(IEnumerable<A> input)
{
// Before C# 4, you couldn't pass in List<B>:
// cannot convert from
// 'System.Collections.Generic.List<ConsoleApplication1.B>' to
// 'System.Collections.Generic.IEnumerable<ConsoleApplication1.A>'
}
Fondamentalement, chaque fois que vous avez eu une fonction qui prend une Énumération d'un certain type, vous ne pouviez pas passer dans une Énumération d'un type dérivé sans explicitement casting.
Juste pour vous avertir d'un piège:
var ListOfB = new List<B>();
if(ListOfB is IEnumerable<A>)
{
// In C# 4, this branch will
// execute...
Console.Write("It is A");
}
else if (ListOfB is IEnumerable<B>)
{
// ...but in C# 3 and earlier,
// this one will execute instead.
Console.Write("It is B");
}
C'est horrible de code de toute façon, mais il n'existe pas et que le changement de comportement en C# 4 peut introduire subtils et difficiles à trouver des bugs si vous utilisez une construction de ce genre.