152

In C# what does where T : class mean?

Ie.

public IList<T> DoThis<T>() where T : class
nan
  • 18,496
  • 7
  • 45
  • 77
Makach
  • 7,170
  • 6
  • 27
  • 36

10 Answers10

130

Simply put this is constraining the generic parameter to a class (or more specifically a reference type which could be a class, interface, delegate, or array type).

See this MSDN article for further details.

Andy Rose
  • 16,282
  • 7
  • 41
  • 48
47

It's a type constraint on T, specifying that it must be a class.

The where clause can be used to specify other type constraints, e.g.:

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

For more information, check out MSDN's page on the where clause, or generic parameter constraints.

Donut
  • 103,927
  • 20
  • 129
  • 143
  • 5
    It is possible to combine these together, e.g: `where T : class, IComparable, new()` – Izzy Mar 10 '16 at 09:49
  • `must be a class`? What about interface? If what `class` word does mean is explained, the concept can be grasped. Or, it is a defect. – snr Feb 05 '22 at 11:24
40

It is a generic type constraint. In this case it means that the generic type T has to be a reference type (class, interface, delegate, or array type).

Oded
  • 477,625
  • 97
  • 867
  • 998
17

That restricts T to reference types. You won't be able to put value types (structs and primitive types except string) there.

Vilx-
  • 101,209
  • 85
  • 267
  • 409
  • This answer (and a couple of other with the same information) was more useful for me than the selected one, because it gives an example of what T cannot be (I was wondering what this constraint actually added to the story) – mins Sep 20 '19 at 10:57
10

where T: class literally means that T has to be a class. It can be any reference type. Now whenever any code calls your DoThis<T>() method it must provide a class to replace T. For example if I were to call your DoThis<T>() method then I will have to call it like following:

DoThis<MyClass>();

If your metthod is like like the following:

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

   // other uses of T as a type

}

Then where ever T appears in your method, it will be replaced by MyClass. So the final method that the compiler calls , will look like the following:

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
 }
explorer
  • 10,860
  • 4
  • 28
  • 36
  • 4
    -1: `new T()` is not possible with `where T : class`. you have to specify `where T: new()` to be allowed to do it. – esskar Jan 22 '13 at 18:02
  • @explorer can we define a single generic method and call it from multiple places to insert a record by passing different parameter's from different places. – Zaker Jun 18 '15 at 06:47
9

it means that the type used as T when the generic method is used must be a class - i.e. it cannot be a struct or built in number like int or double

// Valid:
var myStringList = DoThis<string>();
// Invalid - compile error
var myIntList = DoThis<int>();
Isak Savo
  • 33,809
  • 11
  • 59
  • 91
4

It is called a type parameter constraint. Effectively it constraints what type T can be.

The type argument must be a reference type; this applies also to any class, interface, delegate, or array type.

Constraints on Type Parameters (C# Programming Guide)

Carlos
  • 2,473
  • 25
  • 29
4

T represents an object type of, it implies that you can give any type of. IList : if IList s=new IList; Now s.add("Always accept string.").

AsifQadri
  • 2,388
  • 1
  • 20
  • 30
3

Here T refers to a Class.It can be a reference type.

Hemant Kumar
  • 4,493
  • 9
  • 53
  • 93
1

'T' represents a generic type. It means it can accept any type of class. The following article might help:

http://www.15seconds.com/issue/031024.htm
Randy Minder
  • 45,367
  • 49
  • 183
  • 332