2012-06-28 35 views
6

出於某種原因,這種說法是工作的罰款:在LINQ語句中使用類型別名產生錯誤

vms.Where(vm => vm.MessageType == ValidationMessage.EnumValidationMessageType.Warning) 

但是,如果在類的頂部,我定義別名(爲了節省空間):

using MsgType = ValidationMessage.EnumValidationMessageType; 

然後將所得的代碼行:

vms.Where(vm => vm.MessageType == MsgType.Warning) 

給我一個錯誤:

enter image description here 「委託 'System.Func<ValidationMessage, int, bool>' 不帶1個參數」。有什麼奇怪的是,這不是我正在使用的代表。我使用的.Where<>()的「System.Func<ValidationMessage, bool>」超載 - 同樣的當我不使用別名。

注意,在其他地方正在使用的別名工作正常,這只是內部的這些LINQ的代表,它打破。這是爲什麼發生?

+0

Ahahaha。如果我嘗試通過爲第二個(索引)參數給出一個arg來解決它:'vms.Where((vm,i)=> vm.MessageType == MsgType.Warning)',然後翻轉並說「委託'System.Func '不需要2個參數「!真是笑話。 – Alain

+1

如果你嘗試編譯,你會得到相同的錯誤嗎?或者只是VS錯誤檢測顯示它們? – nemesv

+0

真的很好。我的代碼沒有處於編譯狀態,因此我沒有嘗試它,但是我註釋掉了未完成的代碼,並嘗試運行併發生了更合理的錯誤:它找不到我的類型別名聲明的名稱空間。解決方案是完整地描述類型的路徑:'使用MsgType = WPF.Utilities.ObjectModel.ValidationMessage.EnumValidationMessageType;'之後,所有事情都修復了。 – Alain

回答

2

一旦試圖運行我的程序,所有這些錯誤清除,並出現一個單一的錯誤,抱怨我的類型別名聲明。

的問題是,ValidationMessage.EnumValidationMessageType類型命名空間,它已被宣佈進一步上漲中存在:

using WPF.Utilities.ObjectModel; 
using MsgType = ValidationMessage.EnumValidationMessageType; 

當然,C#想不通其中類型來自基於以前的命名空間的夾雜物,我不得不完全拼出來:

using WPF.Utilities.ObjectModel; 
using MsgType = WPF.Utilities.ObjectModel.ValidationMessage.EnumValidationMessageType; 

一旦我做到了,其他問題就走開了。

我想我只是太趕上並走出LINQ聲明的事實,VS沒有顯示,我用的是化名三元運營商之上的任何錯誤相結合的奇怪的錯誤混淆,那我沒有看到那裏的明顯錯誤。

謝謝你的提示nemesv - 我應該知道優於相信設計時編譯器。

相關問題