Covariância e Contravariância em C#, Parte Dez: Lidando Com Ambiguidades
Suponha que fizemos IEnumerable covariante em T. O que este código deve fazer?
class C : IEnumerable<Girafa>, IEnumerable<Tartaruga>
{
IEnumerator<Girafa> IEnumerable<Girafa>.GetEnumerator()
{
yield return new Girafa();
}
IEnumerator<Tartaruga> IEnumerable<Tartaruga>.GetEnumerator()
{
yield return new Tartaruga();
}
// [etc.]
}
class Program
{
static void Main()
{
IEnumerable<Animal> animais = new C();
Console.WriteLine(animais.First().GetType().ToString());
}
}
Opções:
1) Erro em tempo de compilação.
2) Erro em tempo de execução.
3) Sempre enumera Girafas.
4) Sempre enumera Tartarugas.
5) Escolha entre Girafas e Tartarugas em tempo de execução.
6) Nenhuma das opções acima.
Se você escolheu outra opção além da 1, deveríamos ter um warning em tempo de compilação?