什么是C#泛型方法中的“where T:class”?

时间:2012-03-11 20:15:40

标签: c# generics

这些方法签名有什么区别?

public void T MyMethod<T>(T parameter)

public void T MyMethod<T>(T parameter) where T : class

他们似乎有相同的结果......那么where T : class做了什么?

4 个答案:

答案 0 :(得分:10)

在第二种方法中,T只能是一个类,不能是结构类型。

请参阅Constraints on Type Parameters (C# Programming Guide)

  

其中T:class

     

type参数必须是引用[class] type ;这也适用于任何类,接口,委托或数组类型。

答案 1 :(得分:5)

在第一个中你可以用非ref类型调用它,例如

MyMethod<int>(10);

不适用于第二个版本,因为它只接受ref类型!

答案 2 :(得分:1)

没有区别,但T仅限于参考类型。 它们仅在编译时有所不同,因为编译器检查T是否为ref-type。

答案 3 :(得分:1)

  1. 两者都不会编译。您应该使用voidT
  2. 第二种方法不适用于MyMethod(1),因为它需要T的引用类型