Tại sao điều này tạo ra một lỗi biên dịch:Tại sao biểu thức khởi tạo bộ sưu tập yêu cầu IEnumerable được triển khai?
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" };
}
}
nhưng điều này không:
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" };
}
}
lý do để hạn chế initializers bộ sưu tập là gì - đó là cú pháp đường cho một cuộc gọi đến một phương pháp Add
- đối với các lớp triển khai giao diện không có phương thức an Add
và phương thức nào không được sử dụng?
Có một số điều trong C# tôi không nhận được. Đây là một trong số họ. Khác là 'foreach'. – leppie
@leppie: Bạn không "nhận được" gì về việc tìm kiếm? –
@Jon Skeet: Tôi nghĩ rằng leppie đề cập đến thực tế là trình biên dịch chỉ yêu cầu sự hiện diện của một phương thức mà không yêu cầu một giao diện cụ thể là loại hành vi gõ-vịt bằng ngôn ngữ được đánh máy mạnh. –