Lambda表達比代表定義和帶外方法定義的結合更清楚且相關的額外工作只需要滿足語言定義即可不過它也有一些不足之處如果某個方法的參數包含SystemDelegate 這樣的抽象類型用lambda表達式介紹特殊的問題C#編譯器不能將lambda表達式轉換成還未明確定義的衍生代表類型
如果不仔細思考一下你的代碼看上去就會像是來自NET的東西在本文中我將告訴告訴你為什麼lambda表達式不足以被直接轉換成抽象代表類型並且教你怎樣使得編譯器轉換你所定義的指定代表解決方案依賴於Windows Presentation Foundation(WPF)和SystemWindowsThreadingDispatcher組件但是嚴格意義上說該問題不是一個WPF問題文中所描述的問題出現在若干NET框架中包括Windows FormsOffice 應用程序接口和映射應用程序接口你可以按照下列方法來處理同類問題
無論我什麼時候使用NET框架中帶有來自代表表格的參數的應用程序接口我都會傾向於使用lambda表達式而不是更詳細的表達式例如這行代碼創建了一個SystemWindowsThreadingTimer在計時器失效時該代碼調用了一個TickHandler方法
tick = new SystemThreadingTimer((unused) =>
TickHandler());
如果方法的內容足夠少我就會用方法的內容替代TickHandler()方法調用該方法大多數情況下都有效但是當應用程序接口將SystemDelegate作為參數時這一技巧不管用例如我們將SystemWindowsControlsDispatcherInvoke()方法穿過WPF中的線程實施調用
public object Invoke(
delegate method
params object[] args)
現在考慮一下當我們嘗試用lambda表達式來執行這樣的調用時將會發生什麼
MyTimeDispatcherInvoke(() => DoSomething());
會出現隱秘錯誤
error CS: Cannot convert lambda expression to
type SystemDelegate because it is not a delegate type
或許第一次看到這個錯誤的時候你還不知道到底是怎麼一回事當然這的確是一個代表類型編譯器不像人一樣的靈活SystemDelegate類型是一個抽象類型且該類型的推理工具不能推斷出自變量或某些用於未知代表類型的返回值的數量和種類要解決這一問題我們必須創建一個具體的代表類型並為該類型指定lambda表達式記住代表類型要求你將方法視為數據
我創建了一個WPF計時器程序來展示其工作原理其中闡述了C# 怎樣簡化與老式應用程序接口(下圖)的運行
.NET編程免費提供,內容來源於互聯網,本文歸原作者所有。