- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
C# 7.3 添加了 support用于将泛型类型参数约束为委托(delegate)类型。
public class UsingDelegate<T> where T : System.Delegate { }
public class Multicaster<T> where T : System.MulticastDelegate { }
这可能是微不足道的,但是 where T : System.Delegate
和 where T : System.MulticastDelegate
之间有什么实际区别吗? Microsoft 文档中未记录此内容。
最佳答案
我们无法实例化 Delegate
和 MulticastDelegate
类,因为这些类是抽象
:
public abstract class Delegate : ICloneable, ISerializable { ... }
public abstract class MulticastDelegate : Delegate { ... }
使用委托(delegate)的主要方式是 delegate
关键字。当我们使用 C# 语言关键字 delegate
声明委托(delegate)类型时,C# 编译器会创建从 MulticastDelegate
派生的类的实例。
The reason of why C# compiler creates instances of a class derived from MulticastDelegate is:
This design has its roots in the first release of C# and .NET. One goal for the design team was to ensure that the language enforced type safety when using delegates. That meant ensuring that delegates were invoked with the right type and number of arguments. And, that any return type was correctly indicated at compile time. Delegates were part of the 1.0 .NET release, which was before generics.
The best way to enforce this type safety was for the compiler to create the concrete delegate classes that represented the method signature being used.
Even though you cannot create derived classes directly, you will use the methods defined on these classes.
可以看出,委托(delegate)是 1.0 .NET 版本的一部分,它早于泛型,因此可以得出约束 where T : System.Delegate { }
由于历史原因而存在于 C# 7.3 中,通过创建表示所使用的方法签名的具体委托(delegate)类来强制编译器的类型安全。
关于c# - `where T : Delegate` 还是 `where T : MulticastDelegate` ?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/59892041/
由于我们注册了两次回调函数PrintOne,下面的代码将打印消息“PrintOne”两次。这里有问题, 问题 1> 为什么默认情况下 operator+=(即 Combine)不检查重复的方法处理程序
我尝试使用从userControl到表单的事件,但是在表单构造函数中创建事件时遇到了问题。我不知道哪里失败了。有我的代码。 用户控件 public GameField() {
我有一个仅在生产环境中发生的非常奇怪的问题。异常有消息 "Delegate to an instance method cannot have null 'this'". 抛出异常的方法非常简单,并且
我正在寻找可能对此了解更多的人,我的直觉告诉我答案是“不,它不是线程安全的”,但我想确定一下。 为了说明我的问题,我提供了这个类的一些上下文 public class MyContext {
我有一个 MulticastDelegate,它可以引用具有相同签名的多个(遗留)委托(delegate)之一。例如: public delegate void ObjectCreated(objec
根据 Jon Skeet , "您只能在具有单个目标调用的委托(delegate)上调用 BeginInvoke。" 这是为什么呢?真正的原因是什么? 注意:为了澄清(并且因为我犯了这个错误),我说的
我想从我的库类中引发一系列事件,但我担心某些事件订阅者会很粗鲁并且需要很长时间来处理某些事件,从而阻塞引发事件的线程。我想我可以通过使用线程池线程来引发每个事件来保护引发线程: if (packet
C# 7.3 添加了 support用于将泛型类型参数约束为委托(delegate)类型。 public class UsingDelegate where T : System.Delegate {
调用多播委托(delegate)时,应使用 GetInvocationList 逐一调用委托(delegate): public void IterateAll() { if( _doExec
当我继承 Delegate 或 MulticastDelegate 类时出现编译器错误,尽管我无法继承这些类,但它们都是普通的抽象类。 你能告诉我为什么这些类不被视为基类吗? 最佳答案 因为 Mult
我认为答案是否定的?如果没有,为什么我们要分离 Delegate 和 MulticastDelegate 类?也许又是因为“其他一些 .NET 语言”? 最佳答案 编辑:我以为这是 ECMA 335
虽然 C# 支持 Java 中的委托(delegate)和事件,但我们必须要么使用匿名内部类进行绑定(bind),要么使用反射代码 http://oatv.com/pub/a/onjava/2003/
我在断点处在即时窗口中输入所有这些: typeof(MulticastDelegate).GetFields(BindingFlags.Instance | BindingFlags.Public |
我正在按照建议开发 wcf 服务 here .它解决了我最初在开发原始 .NET 2.0 Web 服务时遇到的 namespace 冲突问题,但我又遇到了另一个问题。 我试图传递给 wcf 服务的对象
我有一个关于委托(delegate)类型的非常基本的问题。我在对象浏览器中比较了 Delegate 和 MulticastDelegate 类的成员,但在 MulticastDelegate 中找不到
我是一名优秀的程序员,十分优秀!