where T : somevalue
có nghĩa là gì? Tôi chỉ thấy một số mã cho biết where T : Attribute
. Tôi nghĩ rằng điều này có liên quan đến Generics nhưng tôi không chắc nó có ý nghĩa gì hay nó đang làm gì."Nơi T: somevalue" nghĩa là gì?
Có ai biết không?
where T : somevalue
có nghĩa là gì? Tôi chỉ thấy một số mã cho biết where T : Attribute
. Tôi nghĩ rằng điều này có liên quan đến Generics nhưng tôi không chắc nó có ý nghĩa gì hay nó đang làm gì."Nơi T: somevalue" nghĩa là gì?
Có ai biết không?
Nó là một constraint on a type parameter, có nghĩa là các loại T
trao cho một lớp chung hoặc phương pháp phải kế thừa từ lớp Attribute
Ví dụ:
public class Foo<T> :
where T : Attribute
{
public string GetTypeId(T attr) { return attr.TypeId.ToString(); }
// ..
}
Foo<DescriptionAttribute> bar; // OK, DescriptionAttribute inherits Attribute
Foo<int> baz; // Compiler error, int does not inherit Attribute
này rất hữu ích, vì nó cho phép các generic lớp học để làm những việc với các đối tượng thuộc loại T
với kiến thức rằng bất kỳ thứ gì là T
cũng phải là Attribute
.
Trong ví dụ trên, đó là okay cho GetTypeId
để truy vấn TypeId
của attr
vì TypeId
là một tài sản của một Attribute
, và vì attr
là một T
nó phải là một loại được thừa kế từ Attribute
.
hạn chế cũng có thể được sử dụng trên các phương pháp chung chung, với tác dụng tương tự:
public static void GetTypeId<T>(T attr) where T : Attribute
{
return attr.TypeId.ToString();
}
Có trở ngại khác mà bạn có thể đặt trên một loại; từ MSDN:
where T: struct
Đối số loại phải đạt được một giá trị loại. Bất kỳ loại giá trị nào ngoại trừ Nullable có thể được chỉ định.
where T : class
Đối số loại phải là một tài liệu tham khảo loại; điều này cũng áp dụng cho bất kỳ lớp học nào, giao diện , đại biểu hoặc loại mảng.
where T : new()
Đối số loại phải có một công constructor parameterless. Khi được sử dụng cùng với các ràng buộc khác, ràng buộc mới() mới() phải được chỉ định cuối cùng.
where T : <base class name>
Đối số loại phải đạt được hoặc lấy được từ lớp cơ sở quy định.
where T : <interface name>
Đối số loại phải đạt được hoặc thực hiện giao diện cụ thể. Nhiều ràng buộc giao diện có thể là được chỉ định. Giao diện ràng buộc cũng có thể là chung chung.
where T : U
Kiểu lập luận cung cấp cho T phải được hoặc xuất phát từ lập luận cung cấp cho U. này được gọi là trần truồng loại hạn chế.
Điều khoản where được sử dụng để giới hạn đối số có thể được chuyển khi sử dụng Generics. Khi bạn tạo một lớp chung chung, bạn có thể quan tâm nhất định để chỉ định một loại đối số tùy thuộc vào cách bạn định sử dụng T trong lớp của bạn. Nếu nó bất cứ điều gì ngoài những gì System.Object có thể làm sau đó nó có lẽ là tốt nhất để sử dụng một constraint như bạn sẽ nhận được một lỗi thời gian biên dịch vs một thời gian chạy.
dụ
Nếu bạn tạo một lớp
class Person<T> where T : System.IComparable<T>
{
//can now use CompareTo
}
Bạn không thể không vượt qua bất cứ điều gì lớp này mà không thực hiện IComparable. Vì vậy, bây giờ an toàn khi sử dụng CompareTo trên bất kỳ thứ gì được chuyển vào lớp Person.
Đó là cách hạn chế loại được sử dụng làm đối số chung. Vì vậy:
where T : SomeType
Phương tiện mà T hoặc phải xuất phát từ SomeType hoặc thực hiện các giao diện SomeType
Ngoài ra những gì người khác nói, bạn có sau quá:
+1 Điều này khá phức tạp. Tôi ước tôi có thể yêu thích một câu trả lời. – Sung