2009-10-09 119 views
4

考慮:C#:我可以將一個顯式委託轉換爲一個Action委託嗎?

delegate void Explicit(); 

我可以:

public void Test(Explicit d) 
{ 
    Action a; 
    a = d; // ???? 
} 

我遇到的情況,我需要重載,有一個構造函數:

public MyClass(Expression<Action> a) {} 

但下面的過載是模糊的:

public MyClass(Action a) {} 

我想通過使用顯式委託可以解決模糊問題,但我需要將該顯式委託轉換爲操作以利用現有代碼。

+0

請注意,這不是一個模棱兩可的問題。即使你沒有一個重載的構造函數,它也不會讓你將一個'Explicit'的實例傳遞給'Action'類型的參數,因爲它們不直接兼容。您仍然需要轉換。 –

回答

11
Action a = new Action(d); 
+4

雖然這可行,但應該注意的是,它實際上創建了一個引用'd.Invoke'的新委託實例。如果你繼續這樣做,委託鏈會增長,每次調用這樣的委託都會產生一連串虛擬的「Invoke」調用,所以會有一定的性能提升(不是說你在實踐中遇到了這個問題)。 –

8

不,您不能在彼此之間使用匹配的簽名轉換不同的委託類型。您必須創建一個新的目標類型的委託/ lambda表達式並轉發到原始類型。

+6

該功能在2006年被要求退還,並被拒絕。 http://connect.microsoft.com/VisualStudio/feedback/ViewFeedback.aspx?FeedbackID=159810 – alex

+0

@alex死鏈接404 – CyberFox

4

還可以指定Invoke方法來創建新的Action委託

Action a = new Action(d.Invoke);