为什么此Delegate约束不适用于定义事件?

皮克斯曼

我在这个类中尝试为其中一个类创建模板,为此,我需要能够传递委托类型来定义事件。我添加了委托约束,以确保它是一个委托。

public abstract class TemplateScriptEvent<DelegateType> : ScriptEvent where DelegateType : Delegate
{
    public event DelegateType Event;
}

但是,这导致

Error CS0066 '_ScriptEvent<DelegateType>.Event': event must be of a delegate type

我正在尝试做的事情是否可能,为什么会失败?

我正在使用.Net Framework 4.7.2。

杰尔吉·科塞格(GyörgyKőszeg)

它不起作用,因为您不能将通用参数强制为的非抽象派生类型MulticastDelegate,这将满足C#事件声明(换句话说,您可以用Delegate类型本身代替约束参数)。

推荐的解决方案:

如果使用常规事件,则根本不需要使用委托约束。只需使用通用EventHandler<T>委托并仅替换其事件参数即可:

public abstract class TemplateScriptEvent<TEventArgs> : ScriptEvent
    where TEventArgs : EventArgs
{
    public event EventHandler<TEventArgs> Event;

    protected virtual void OnEvent(TEventArgs e) => Event?.Invoke(this, e);
}

任何委托类型的抽象“事件”:

如果您确实要使用任何委托类型,那么您可以执行的最接近的解决方案是这样的:

public abstract class TemplateScriptDelegate<TDelegate, TResult> : ScriptEvent
    where TDelegate : Delegate
{
    // this is a simple property rather than an event, but allows +=/-= for concrete delegate types
    // (and also simple assignments).
    public TDelegate Event { get; set; }

    // you must implement this in a more concrete derived type
    protected abstract TResult OnEvent();
}

// To be able to use this you need a derived type for each delegate types (which of course,
// can have type arguments for return value and parameters).
// For example, you can have a derived type for Func<T> delegates:
public class TemplateScriptFunc<TResult> : TemplateScriptDelegate<Func<TResult>, TResult>
{
    protected override TResult OnEvent() => Event.Invoke();
}

本文收集自互联网,转载请注明来源。

如有侵权,请联系 [email protected] 删除。

编辑于
0

我来说两句

0 条评论
登录 后参与评论

相关文章

为什么此未定义检查不适用于查找功能?

为什么此代码不适用于svg元素?

为什么此查询不适用于指定的日期?

为什么此过渡属性不适用于 css?

为什么加载事件的addEventListener不适用于div?

为什么更改事件不适用于输入?

为什么 String.replace() 不适用于事件?

为什么此解决方案适用于 Javascript 而不适用于 Python?(动态编程)

为什么此扩展方法适用于泛型而不适用于设置的基本类型?

颤动约束不适用于任何屏幕尺寸,为什么?

为什么此模式不适用于敲除验证?(分隔的邮政编码)

为什么使用移位的此交换宏不适用于负数?

了解此DNN模型以及为什么它不适用于多标签分类

为什么此解决方案不适用于硬币找零算法?

为什么此string。标点符号代码不适用于剥离标点符号?

为什么此日志记录设置不适用于 INFO?

为什么此Dijkstra算法不适用于此特定输入?

为什么此Bootstrap复选框不适用于jQuery?

为什么此 Java NaCl 加密不适用于 GitHub Actions Secrets

为什么此红宝石序列不适用于两位数数字?

为什么此代码不适用于特定类型的数据?

Perl:为什么此表达式不适用于新版本的Perl?

为什么此jQuery验证不适用于IE 7/8?

为什么此数学运算不适用于宏?

为什么文档选择器不适用于 mouseenter 事件?

离子2:为什么更改事件不适用于离子选择?

为什么 WorkSheet_Change 事件不适用于多行

为什么我的函数适用于矩阵但为什么不适用于向量?

为什么我的Javascript警报不适用于此自定义WordPress插件?