C # 'da' nerede T: sınıf 'ne anlama geliyor?


135

C # dilinde ne anlama where T : classgeliyor?

Yani.

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

Yanıtlar:


115

Basitçe söylemek gerekirse, bu genel parametreyi bir sınıfa (veya daha spesifik olarak bir sınıf, arabirim, temsilci veya dizi türü olabilecek bir başvuru türü) sınırlamaktır.

Daha fazla ayrıntı için bu MSDN makalesine bakın.


4
Bir vakayı kaçırdın. T için tür bağımsız değişkeni, başvuru türü olarak kısıtlanan herhangi bir başka tür parametresi de olabilir .
Eric Lippert

38

Bu bir olan genel tür kısıtlaması . Bu durumda, genel türün Tbir başvuru türü (sınıf, arabirim, temsilci veya dizi türü) olması gerektiği anlamına gelir .


35

Bu T, bir sınıf olması gerektiğini belirten bir tür kısıtlamasıdır .

whereFıkra gibi diğer tip sınırlamaları belirtebilirsiniz kullanılabilir:

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

Daha fazla bilgi için, MSDN'nin whereyan tümce veya genel parametre kısıtlamalarına ilişkin sayfasına bakın .


5
Bunları birleştirmek mümkündür, örneğin:where T : class, IComparable, new()
Izzy

17

Bu T, referans türleriyle sınırlıdır . Değer türlerini (türleri structve ilkel türleri hariç string) oraya koyamazsınız .


Bu cevap (ve aynı bilgiye sahip birkaç kişi) benim için seçilenden daha yararlıydı, çünkü T'nin ne olamayacağına dair bir örnek veriyor (bu kısıtlamanın hikayeye gerçekte ne eklediğini merak ediyordum)
dakika

9

o tip olarak kullanıldığı anlamına gelir Tjenerik yöntem bir sınıf olmalıdır kullanıldığında - yani bir yapı ya da benzeri sayısında inşa olamaz intyadouble

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

8

where T: class tam anlamıyla bu demektir T has to be a class. Herhangi bir referans türü olabilir. Artık herhangi bir kod DoThis<T>()yönteminizi çağırdığında, T'nin yerini alacak bir sınıf sağlamalıdır . Örneğin, DoThis<T>()yönteminizi çağıracak olsaydım, aşağıdaki gibi çağırmam gerekecek:

DoThis<MyClass>();

Yönteminiz aşağıdaki gibiyse:

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

   // other uses of T as a type

}

Daha sonra yönteminizde T göründüğü her yerde, MyClass ile değiştirilecektir. Dolayısıyla, derleyicinin çağırdığı son yöntem aşağıdaki gibi görünecektir:

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()ile mümkün değildir where T : class. bunu yapmanıza where T: new()izin verilmesini belirtmeniz gerekir.
esskar

@explorer, tek bir jenerik yöntem tanımlayabilir ve onu birden çok yerden, farklı parametreler farklı yerlerden geçirerek bir kayıt eklemek için çağırabilir miyiz.
Zaker


4

T bir nesne türünü temsil eder, herhangi bir tür verebileceğiniz anlamına gelir. IList: if IList s = new IList; Şimdi s.add ("Dizeyi her zaman kabul et.").



1

'T' genel bir türü temsil eder. Bu, her tür sınıfı kabul edebileceği anlamına gelir. Aşağıdaki makale yardımcı olabilir:

http://www.15seconds.com/issue/031024.htm
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.