`where T : Delegate` 还是 `where T : MulticastDelegate`?

Fre*_*ler 5 .net c# generics delegates

C# 7.3 添加了对将泛型类型参数约束为委托类型的支持。

public class UsingDelegate<T> where T : System.Delegate { }
public class Multicaster<T> where T : System.MulticastDelegate { }
Run Code Online (Sandbox Code Playgroud)

where T : System.Delegate这可能是微不足道的,但是和 之间有什么实际区别吗where T : System.MulticastDelegate?Microsoft 文档中未记录此内容。

Ste*_*pUp 3

我们无法实例化DelegateMulticastDelegate,因为这些类是abstract

 public abstract class Delegate : ICloneable, ISerializable { ... }

 public abstract class MulticastDelegate : Delegate { ... }
Run Code Online (Sandbox Code Playgroud)

与代表合作的主要方式是delegate关键字。MulticastDelegate当我们使用 C# 语言关键字声明delegate委托类型时,C# 编译器会创建派生类的实例。

C# 编译器创建从 MulticastDelegate 派生的类的实例的原因是:

此设计源于 C# 和 .NET 的第一个版本。设计团队的目标之一是确保语言在使用委托时强制执行类型安全。这意味着确保使用正确的参数类型和数量来调用委托。并且,任何返回类型都在编译时正确指示。委托是 1.0 .NET 版本的一部分,该版本早于泛型。

强制执行这种类型安全的最佳方法是让编译器创建表示所使用的方法签名的具体委托类。

即使您不能直接创建派生类,您也将使用这些类上定义的方法。

可以看出,委托是 1.0 .NET 版本的一部分,该版本早于泛型,因此可以得出结论,where T : System.Delegate { }由于历史原因,C# 7.3 中存在约束,通过创建表示的具体委托类来强制编译器的类型安全。正在使用的方法签名。