2009-03-07 28 views
11

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?

Trả lời

28

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 attrTypeId 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ế.

+0

+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

1

Đ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.

1

Đó 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

5

Ngoài ra những gì người khác nói, bạn có sau quá:

  • mới () - T phải có hàm tạo mặc định
  • lớp - T phải là loại tham chiếu
  • struct - T phải là một loại giá trị