¿Por qué esto genera un error de compilación:¿Por qué una expresión de inicializador de colección requiere que se implemente IEnumerable?
class X { public void Add(string str) { Console.WriteLine(str); } }
static class Program
{
static void Main()
{
// error CS1922: Cannot initialize type 'X' with a collection initializer
// because it does not implement 'System.Collections.IEnumerable'
var x = new X { "string" };
}
}
pero esto no lo hace:
class X : IEnumerable
{
public void Add(string str) { Console.WriteLine(str); }
IEnumerator IEnumerable.GetEnumerator()
{
// Try to blow up horribly!
throw new NotImplementedException();
}
}
static class Program
{
static void Main()
{
// prints “string” and doesn’t throw
var x = new X { "string" };
}
}
¿Cuál es la razón para restringir inicializadores colección - que son el azúcar sintáctica para una llamada a un método Add
- a las clases que implementan una interfaz que no tiene tiene un método Add
y que no se utiliza?
Hay algunas cosas en C# que simplemente no entiendo. Este es uno de ellos. Otro es 'foreach'. – leppie
@leppie: ¿Qué no "entiendes" de foreach? –
@Jon Skeet: Creo que Leppie se refiere al hecho de que el compilador simplemente requiere la presencia de un método sin requerir una interfaz específica que es una especie de comportamiento de pato en un lenguaje fuertemente tipado. –