Error del compilador CS1640

Actualización: noviembre 2007

Mensaje de error

La instrucción foreach no puede funcionar en variables de tipo 'tipo' porque implementa varias creaciones de instancias de 'interfaz', intente convertir en una creación de instancia de interfaz específica
foreach statement cannot operate on variables of type 'type' because it implements multiple instantiations of 'interface', try casting to a specific interface instantiation

El tipo hereda de dos o más instancias de IEnumerator<T>. Esto significa que no hay una enumeración única del tipo utilizable por foreach. Especifique el tipo de IEnumerator<T> o utilice otra construcción de bucle.

Ejemplo

El código siguiente genera el error CS1640:

// CS1640.cs

using System;
using System.Collections;
using System.Collections.Generic;

public class C : IEnumerable, IEnumerable<int>, IEnumerable<string>
{
    IEnumerator<int> IEnumerable<int>.GetEnumerator()
    {
        yield break;
    }

    IEnumerator<string> IEnumerable<string>.GetEnumerator()
    {
        yield break;
    }

    IEnumerator IEnumerable.GetEnumerator()
    {
        return (IEnumerator)((IEnumerable<string>)this).GetEnumerator();
    }
}

public class Test
{
    public static int Main()
    {
        foreach (int i in new C()){}    // CS1640

        // Try specifing the type of IEnumerable<T>
        // foreach (int i in (IEnumerable<int>)new C()){}
        return 1;
    }
}