如何在C#中使用非泛型委托类型扩展泛型委托类型?

时间:2017-05-06 00:27:33

标签: c# generics inheritance syntax delegates

我想定义一个扩展泛型委托的非泛型委托,以定义泛型委托类型参数的默认值,即类似这样的东西(不是一个有效的C#代码,但是一个明显可以理解的插图。概念我的意思是希望):

public delegate void MyDelegate<T>(T arg);

public delegate void MyDelegate(object arg) : MyDelegate<object>;

什么是正确的方式来声明这个?

毋庸置疑,我可以宣布两个独立的代表,以这样的方式实现几乎相同的效果:

public delegate void MyDelegate<T>(T arg);

public delegate void MyDelegate(object arg);

但是我想做出它们之间的实际关系(裸MyDelegate类型的意思是等于MyDelegate<object>,就像类扩展另一个类或字面意思一样确定并使以下代码在可能的情况下变为有效:

MyDelegate<object> d1;

MyDelegate d2;

MyDelegate d1 = d2;

1 个答案:

答案 0 :(得分:1)

对不起,我说你应该知道代表类型是密封的,我可能太苛刻了。在规范中很明显,但我看了一下最新版本的MSDN语言文档,它似乎根本没有提到这一点。好吧,无论如何......他们是密封的。您无法创建继承委托类型的新类,并且您当然无法使用delegate关键字来声明继承另一个委托类型的新委托类型(该关键字具有非常具体的语法,甚至不允许继承语法。

我仍然不太清楚你正在尝试做什么。但是,从某种意义上说,委托类型是只有一个成员的接口。当然,它更灵活,因为实现不是单一类型,而是任何类型的任何方法。但从概念上讲,两者非常相似。

从这个意义上讲,您可以使用interface代替delegate在代码中表达您的意图。例如:

interface IDelegate<T>
{
    void M(T arg);
}

interface IDelegateObject : IDelegate<object> { }

当然,问题在于现在你需要一些能够实现相关接口的类型。任何给定的类型只能实现任何给定的接口一次,所以你失去了委托类型通常给你的很多灵活性。

但是,你可以做这样的事情:

IDelegate<object> d1;
IDelegateObject d2;

d1 = d2;

也就是说,由于IDelegateObject继承IDelegate<object>,因此&#34;是&#34; IDelegate<object>,您可以将IDelegateObject类型的值(即d2)分配给IDelegate<object>类型的变量,即d1