Dlaczego ta generuje błąd kompilatora:Dlaczego wyrażenie inicjujące kolekcję wymaga implementacji 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" };
}
}
ale to nie:
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" };
}
}
Co jest powodem ograniczenia inicjatorów Collection - które są cukier syntaktyczny dla wywołania metody Add
- do klas implementujących interfejs, który nie ma metody, która nie jest używana?
Jest kilka rzeczy w C# Po prostu nie dostaję. To jedna z nich. Innym jest "foreach". – leppie
@leppie: Czego nie "dostajesz" o foreach? –
@Jon Skeet: Myślę, że leppie odnosi się do faktu, że kompilator po prostu wymaga obecności metody, nie wymagając określonego interfejsu, który jest rodzajem kaczego pisania w mocno napisanym języku. –