2013-12-11 48 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));