2010-09-24 64 views

Trả lời

83

một cách đơn giản này đang kìm hãm sự tham số chung cho một lớp (hoặc cụ thể hơn là một kiểu tham chiếu có thể là một lớp, giao diện, đại biểu hoặc kiểu mảng).

Xem chi tiết MSDN article để biết thêm chi tiết.

+2

Bạn đã bỏ lỡ một trường hợp. Đối số kiểu cho T cũng có thể là * bất kỳ tham số kiểu nào khác bị ràng buộc là kiểu tham chiếu *. –

+0

Được bỏ phiếu cho liên kết MSDN được cung cấp. của nó rất hữu ích – SaddamBinSyed

1

'T' là loại chung. Nó có nghĩa là nó có thể chấp nhận bất kỳ loại lớp nào. Bài viết sau có thể giúp:

http://www.15seconds.com/issue/031024.htm 
34

Đây là generic type constraint. Trong trường hợp này, nó có nghĩa là kiểu chung T phải là một kiểu tham chiếu (lớp, giao diện, đại biểu hoặc loại mảng).

8

nó có nghĩa là loại sử dụng như T khi các phương pháp chung được sử dụng phải có một lớp học - tức là nó không thể là một struct hoặc xây dựng tại số như int hay double

// Valid: 
var myStringList = DoThis<string>(); 
// Invalid - compile error 
var myIntList = DoThis<int>(); 
28

Đó là ràng buộc loại trên T, chỉ định rằng đó phải là một lớp.

Mệnh where có thể được dùng để xác định những hạn chế loại khác, ví dụ .:

where T : struct // T must be a struct 
where T : new() // T must have a default parameterless constructor 
where T : IComparable // T must implement the IComparable interface 

Để biết thêm thông tin, hãy kiểm tra trang MSDN của trên where clause, hoặc generic parameter constraints.

+3

Có thể kết hợp chúng lại với nhau, ví dụ: 'trong đó T: class, IComparable, new()' – Izzy

13

Điều đó hạn chế T thành loại tham chiếu. Bạn sẽ không thể đặt loại giá trị (struct s và các loại nguyên thủy trừ string) tại đó.

4

Nó được gọi là ràng buộc tham số kiểu. Hiệu quả nó hạn chế loại T có thể là gì.

Đối số loại phải là tham chiếu type; đ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.

Constraints on Type Parameters (C# Programming Guide)

4

T đại diện cho một loại đối tượng của, nó ngụ ý rằng bạn có thể đưa ra bất cứ loại. IList: nếu IList s = new IList; Bây giờ s.add ("Luôn chấp nhận chuỗi.").

5

where T: class theo nghĩa đen có nghĩa là T has to be a class. Nó có thể là bất kỳ loại tham chiếu nào. Bây giờ bất cứ khi nào bất kỳ mã nào gọi phương thức DoThis<T>() của bạn, nó phải cung cấp một lớp để thay thế T.Ví dụ nếu tôi được gọi phương thức DoThis<T>() của bạn sau đó tôi sẽ phải gọi nó là như sau:

DoThis<MyClass>(); 

Nếu metthod bạn cũng giống như như sau:

public IList<T> DoThis<T>() where T : class 
{ 
    T variablename = new T(); 

    // other uses of T as a type 

} 

Sau đó, có bao giờ T xuất hiện trong bạn , nó sẽ được thay thế bằng MyClass. Vì vậy, phương thức cuối cùng mà trình biên dịch gọi, sẽ trông giống như sau:

public IList<MyClass> DoThis<MyClass>() 
{ 
    MyClass variablename= new MyClass(); 

    //other uses of MyClass as a type 

    // all occurences of T will similarly be replace by MyClass 
} 
+3

-1: 'new T()' là không thể với 'where T: class'. bạn phải chỉ định 'where T: new()' để được phép làm điều đó. – esskar

+0

@explorer chúng ta có thể định nghĩa một phương thức chung duy nhất và gọi nó từ nhiều nơi để chèn một bản ghi bằng cách truyền tham số khác nhau từ các vị trí khác nhau. – User

2

Đây T là một loại tham chiếu.