Trong c #, "T: class" nghĩa là gì?


135

Trong C # where T : classcó nghĩa là gì?

I E.

public IList<T> DoThis<T>() where T : class

Câu trả lời:


115

Nói một cách đơn giản, đây là ràng buộc tham số chung cho một lớp (hay cụ thể hơn là một kiểu tham chiếu có thể là một lớp, giao diện, ủy nhiệm hoặc kiểu mảng).

Xem bài viết MSDN này để biết thêm chi tiết.


4
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ố loại nào khác bị ràng buộc là kiểu tham chiếu .
Eric Lippert

38

Đây là một ràng buộc kiểu chung . Trong trường hợp này, điều đó có nghĩa là kiểu chung Tphải là kiểu tham chiếu (lớp, giao diện, ủy nhiệm hoặc kiểu mảng).


35

Đó là một ràng buộc kiểu T, chỉ định rằng nó phải là một lớp.

Các wheređiều khoản có thể được dùng để xác định những hạn chế loại khác, ví dụ như:

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 xem trang của MSDN về wheremệnh đề hoặc các ràng buộc tham số chung .


5
Có thể kết hợp những thứ này lại với nhau, ví dụ:where T : class, IComparable, new()
Izzy

17

Đó hạn chế Tđến các loại tài liệu tham khảo . Bạn sẽ không thể đặt các loại giá trị ( structs và loại nguyên thủy trừ string) ở đó.


Câu trả lời này (và một vài câu hỏi khác có cùng thông tin) đối với tôi hữu ích hơn câu hỏi được chọn, bởi vì nó đưa ra một ví dụ về những gì T không thể (tôi đã tự hỏi điều gì ràng buộc này thực sự được thêm vào câu chuyện)
phút

9

nó có nghĩa là kiểu được sử dụng như Tkhi phương thức chung được sử dụng phải là một lớp - tức là nó không thể là một cấu trúc hoặc được xây dựng theo số lượng như inthoặcdouble

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

8

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

DoThis<MyClass>();

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

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

   // other uses of T as a type

}

Sau đó, bất cứ khi nào T xuất hiện trong phương thức của 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ẽ 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
 }

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

@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 chuyển các tham số khác nhau từ các vị trí khác nhau.
Zaker


4

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


2

Ở đây T đề cập đến một Class.It có thể là một loại tham chiếu.


1

'T' đại diện cho một loại chung. Nó có nghĩa là nó có thể chấp nhận bất kỳ loại lớp. Bài viết sau đây có thể giúp:

http://www.15seconds.com/issue/031024.htm
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.