2017-05-06 119 views
1

我想定义非泛型委托延伸的泛型委托来定义泛型委托类型参数的默认,即是这样的(不是有效的一段C#代码,但一个明显易懂的插图概念我的意思是希望):如何在C#中使用非泛型委托类型扩展泛型委托类型?

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

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

什么是,如果有的话,正确的方式来声明呢?

不用说,我可以只申报2个独立的代表达到几乎同样的效果这样的方式:

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

public delegate void MyDelegate(object arg); 

,但我想这样做,使他们之间的实际关系(其实裸MyDelegate型是指等于MyDelegate<object>,就像一个类扩展另一个类或直译)明确的方式,使下面的代码将成为可能的话有效:

MyDelegate<object> d1; 

MyDelegate d2; 

MyDelegate d1 = d2; 
+3

委托类型是密封的,你应该清楚地知道。它们不能被继承。什么是你[究竟意欲何为?(https://meta.stackexchange.com/questions/66377/what-is-the-xy-problem)。通过这种方式表达你的委托声明,你会获得什么?请注意,在某种意义上,代表是单成员接口。因此,如果您真的需要这样做,那么很可能将您的关系表达为“接口”类型,而不是“委托类型”更合适。 –

+1

@PeterDuniho我觉得这样尴尬,但我不知道他们在密封的想法,以检查他们是否是还没有进入我的脑海: - ]谢谢你告诉。您可以将此作为答案提交,如果可以,我会接受。我用一个我想要实现的例子来扩展这个问题。 – Ivan

回答

1

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

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

从这个意义上说,您可以使用interface而不是delegate表示您的代码意图。例如:

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

interface IDelegateObject : IDelegate<object> { } 

当然,问题在于现在您需要某种类型来实现接口。任何给定的类型只能实现任何给定的接口,所以你失去了委托类型通常会给你的很大的灵活性。

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

IDelegate<object> d1; 
IDelegateObject d2; 

d1 = d2; 

也就是说,因为IDelegateObject继承IDelegate<object>,因而“是” IDelegate<object>,那么你可以分配IDelegateObject类型的值,即d2 ,到IDelegate<object>类型的变量,即d1

+1

通过接口,您可以使用差异 - 因此,如果根据您的需要/选项使用“IDelegate ”或“IDelegate ”,则可以完成更多的分配任务。 –