2013-12-11 50 views
0

我有这需要一个ThreadStart作为参数的方法和我通常称它为喜欢:持有委托的通用类型?

public void myMethod(ThreadStart ts) { ... } 
myMethod(delegate() {...}); 

我想有此委托分配给一个变量,但是,将其传递到函数之前。当我使用

Action myDel = delegate() {...}; 
myMethod(myDel); 

..我得到一个关于没有匹配的方法签名的错误。我可以制作什么类型的myDel,以便它可以与代表的实际身体互换使用?

+0

忘记'ThreadStart'。使用'Task.Factory.StartNew()'或类似的东西。否则,如果你在C#5中使用'async/await'。 –

回答

2

你为什么不定义myDel作为一个ThreadStart委托这样?

ThreadStart myDel =() => DoSomething(); 

的ThreadStart行动代表签名匹配,但它们是不同的类型。因此,您可以简单地将您的委托定义为ThreadStart ..

+0

+1。 Eric Lippert解释了为什么具有相同签名的代表不兼容:http://stackoverflow.com/questions/2488643/why-cant-i-use-cast-an-action-for-to-a-threadstart – dcastro

0

原因是您不能将委托分配给其他委托(仅仅因为两个类具有相同的字段并不意味着您应该能够处理一个委托就好像它是另一个。同样的逻辑也适用于委托) 看到这个post通过乔恩斯基特 “兼容性”并不一定意味着签名是相同的)

因此,例如,你可以使用这个棘手的模式让你的代码工作

 Action myDel = delegate() {}; 
     myMethod(new ThreadStart(myDel));