I searched about generic type in C#
and I made this conclusion:
Class
struct
The main differences between struct and class, apart the global differences between value and reference type, are :
No inheritance in struct
The struct can not contain an empty constructor(without arguments)
Where T: class ==>the generic parameter must be a reference type
Where T:classA ==>the generic parameter must be an instance of the class classA
Where T:InterfaceA ==> the generic parameter must implement the interface InterfaceA
Where T:New() ==> the generic parameter must be a class + have a default empty constructor
Where T:U ==> the generic parameter must be derived the class U or implement the interface U
Where T: struct ==> the generic parameter must be a value type
So I need to know:
where T: New() ==> class with empty constructor
where T: class, New() ==> class with empty constructor
Why the second form is used? Why we don't just use the first one?
Thanks,
What you're describing are generic constraints.
Where T:New() ==> the generic parameter must be a class + have a default empty constructor
No, that just says "the type argument must have a parameterless constructor". That actually includes all value types. Even though you couldn't declare your own parameterless constructors for structs before C# 6, you could always call them. For example:
Guid guid = new Guid();
So if you have:
public void Foo<T>() where T : new()
it's perfectly valid to call
Foo<Guid>();
See more on this question at Stackoverflow