C#泛型方法中的"where T : class"是什么意思?

11
这些方法签名有什么区别?
public void T MyMethod<T>(T parameter)

并且

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

它们似乎具有相同的结果...那么where T : class是做什么用的呢?


3
关于文档,有什么不清楚的地方吗? - Adam Mihalcin
4个回答

12
在第二种方法中,T 只能是类,不能是结构类型。
请参阅《类型参数的限制 (C# 编程指南)》(Constraints on Type Parameters (C# Programming Guide)):

其中 T : class

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


6
在第一个示例中,您可以使用非引用类型进行调用,例如:
MyMethod<int>(10);

第二个版本只接受引用类型,因此这种方法不适用于第二个版本!


1

它们之间没有区别,但 T 受限于引用类型。它们只在编译时不同,编译器会检查 T 是否为 ref-type。


1
那么,它们之间确实有区别;-) 我想知道它们是否发出相同的IL(例如,该信息是否保留?) - user166390

1
  1. 两者都无法编译。你应该使用 voidT 中的一个。
  2. 第二种方法对于 MyMethod(1) 不起作用,因为它需要将引用类型转换为 T

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接