Chúng ta đều biết rằng các thuộc tính trong C # được biên dịch theo các phương thức cũ đơn giản thực tế. Nhưng không giống như các phương thức (-group), chúng không thể được đưa ra làm đối số cho các phương thức khác mong đợi một đại biểu như một Func<T>
hoặc Action<T>
(getter và setter). Có điều gì đặc biệt cấm điều này không, hay nó chỉ là một tính năng không "miễn phí" khi tạo các nhóm phương thức hoàn toàn có thể chuyển đổi cho các đại biểu?
Mã ví dụ:
public class MyClass
{
public static int X { get; set; }
}
private static void Foo<T>(Func<T> f)
{
Console.WriteLine(f());
}
private static void Bar<T>(Action<T> f)
{
f(default(T));
}
private static void Test()
{
// neither of these lines compile, even with an explicit type-cast.
Foo(MyClass.X);
Bar(MyClass.X);
}
Nếu tôi phải đoán, tôi sẽ nói rằng vấn đề cú pháp phân biệt giữa các yêu cầu và tham chiếu đến chính tài sản đó không đáng để giải quyết khi chúng ta có thể viết thêm () => MyClass.X
hoặc viết x => MyClass.X = x
.
set
là một Action
và get
là một Func
ví dụ
delegate {return SomeProperty}
vượt qua getter; delegate(YourType value) {SomeProperty = value}
vượt qua setter. Nếu bạn chỉ cần vượt qua một hoặc hai địa điểm, đây là cách viết tắt cho các phương thức được bao bọc mà bạn sẽ tạo.
Interface
đó và thay đổi chữ ký của phương thức được gọi để lấy giao diện đó làm tham số.