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


135

Dalam C # apa where T : classartinya?

Yaitu.

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

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.


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


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 .


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.


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>();

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
 }

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.").



1

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

http://www.15seconds.com/issue/031024.htm
Dengan menggunakan situs kami, Anda mengakui telah membaca dan memahami Kebijakan Cookie dan Kebijakan Privasi kami.
Licensed under cc by-sa 3.0 with attribution required.