2012-06-28 9 views
6

Z jakiegoś powodu to oświadczenie działa poprawnie:Korzystanie typu alias w oświadczeniu linq generuje błąd

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

Ale jeśli na szczycie klasy I zdefiniować alias (w celu zaoszczędzenia miejsca):

using MsgType = ValidationMessage.EnumValidationMessageType; 

Następnie uzyskany wiersz kodu:

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

wyskakuje mi błąd:

enter image description here "Delegat" System.Func<ValidationMessage, int, bool> "nie przyjmuje 1 argumentów". To dziwne, że nie jest to Delegat, którego używam. Używam przeciążenia System.Func<ValidationMessage, bool> 'z .Where<>() - tak samo jak wtedy, gdy nie używałem tego aliasu.

Zauważ, że wszędzie, gdzie używany jest alias, działa dobrze, tylko wewnątrz tych delegatów linq się psuje. Dlaczego to się dzieje?

+0

Ahahaha. Jeśli spróbuję obejść to poprzez podanie argumentu dla drugiego argumentu (indeks): 'vms.Where ((vm, i) => vm.MessageType == MsgType.Warning), to odwraca i mówi" Delegat "System.Func " nie przyjmuje 2 argumentów "! Co za żart. – Alain

+1

Czy występują te same błędy, jeśli próbujesz skompilować? Czy po prostu pokazuje to błąd wykrywania VS? – nemesv

+0

Naprawdę dobry punkt. Mój kod nie był inaczej w stanie kompilacji, więc nie próbowałem go, ale skomentowałem niedokończony kod i próbowałem uruchomić i znacznie bardziej uzasadniony błąd: nie mógł znaleźć przestrzeni nazw dla deklaracji aliasu mojego typu. Rozwiązaniem było pełne przeliterowanie ścieżki do typu: 'using MsgType = WPF.Utilities.ObjectModel.ValidationMessage.EnumValidationMessageType;' Po tym wszystkim wszystko się naprawiło. – Alain

Odpowiedz

2

Po próbie uruchomienia mojego programu usunięto wszystkie te błędy i pojawił się jeden błąd narzekający na deklarację aliasu mojego typu.

Problem polegał na tym, że typ ValidationMessage.EnumValidationMessageType istniały w przestrzeni nazw, które zostały uznane dalej w górę:

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

Oczywiście, C# nie można dowiedzieć się, gdzie typ pochodzi podstawie wcześniejszych włączeń przestrzeni nazw, Musiałem to przeliterować:

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

Kiedy to zrobiłem, drugi problem zniknął.

Sądzę, że byłem tak bardzo pochłonięty i zakłopotany dziwnymi błędami wychodzącymi z instrukcji linq, w połączeniu z faktem, że VS nie pokazywał błędów, w których używałem aliasu w powyższych potrójnych operatorach, że Nie widziałem tam oczywistego błędu.

Dzięki za podpowiedź nemesv - powinienem wiedzieć, że nie ufam kompilatorowi w czasie projektowania.