Dalam c # apa artinya 'di mana T: kelas'?

135

Dalam C # apa where T : classartinya?

Yaitu.

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

Jawaban:

115

Sederhananya, ini membatasi parameter generik ke kelas (atau lebih spesifiknya tipe referensi yang bisa berupa kelas, antarmuka, delegasi, atau tipe array).

Lihat artikel MSDN ini untuk perincian lebih lanjut.

Andy Rose
sumber
4
Anda melewatkan satu kasing. Argumen tipe untuk T juga bisa berupa parameter tipe lain yang dibatasi menjadi tipe referensi .
Eric Lippert
38

Ini adalah batasan tipe generik . Dalam hal ini berarti tipe generik Tharus menjadi tipe referensi (kelas, antarmuka, delegasi, atau tipe array).

Oded
sumber
35

Ini adalah batasan tipe T, yang menentukan bahwa itu harus kelas.

The whereklausa dapat digunakan untuk menentukan batasan jenis lain, misalnya:

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

Untuk informasi lebih lanjut, lihat halaman MSDN pada whereklausa , atau batasan parameter umum .

Donat
sumber
5
Dimungkinkan untuk menggabungkan ini bersama-sama, misalnya:where T : class, IComparable, new()
Izzy
17

Itu membatasi Tuntuk tipe referensi . Anda tidak akan dapat menempatkan tipe nilai ( structkecuali tipe primitif string) di sana.

Vilx-
sumber
Jawaban ini (dan beberapa lainnya dengan informasi yang sama) lebih bermanfaat bagi saya daripada yang dipilih, karena memberikan contoh tentang apa yang tidak dapat T (saya bertanya-tanya apa kendala ini sebenarnya ditambahkan ke cerita)
mnt
9

itu berarti bahwa jenis yang digunakan seperti Tketika metode generik digunakan harus kelas - yaitu tidak dapat berupa struct atau dibangun dalam jumlah seperti intataudouble

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

where T: class secara harfiah berarti itu T has to be a class. Ini bisa berupa tipe referensi apa saja. Sekarang setiap kali kode apapun panggilan Anda DoThis<T>()metode itu harus menyediakan kelas untuk menggantikan T . Misalnya jika saya akan memanggil DoThis<T>()metode Anda maka saya harus memanggilnya seperti berikut:

DoThis<MyClass>();

Jika metthod Anda seperti berikut:

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

   // other uses of T as a type

}

Lalu di mana T muncul dalam metode Anda, itu akan diganti oleh MyClass. Jadi metode terakhir yang dipanggil kompiler, akan terlihat seperti berikut:

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
 }
penjelajah
sumber
4
-1: new T()tidak mungkin dengan where T : class. Anda harus menentukan where T: new()untuk diizinkan melakukannya.
esskar
@explorer dapat kita tentukan metode generik tunggal dan memanggilnya dari beberapa tempat untuk memasukkan catatan dengan melewatkan parameter yang berbeda dari tempat yang berbeda.
Zaker
4

T mewakili tipe objek, ini menunjukkan bahwa Anda dapat memberikan semua tipe. IList: if IList s = IList baru; Sekarang s.add ("Selalu terima string.").

AsifQadri
sumber
2

Di sini T merujuk ke Kelas. Ini bisa menjadi tipe referensi.

Hemant Kumar
sumber
1

'T' mewakili tipe generik. Itu berarti dapat menerima semua jenis kelas. Artikel berikut mungkin membantu:

http://www.15seconds.com/issue/031024.htm
Randy Minder
sumber