6

何らかの理由で、このステートメントは正常に機能しています。

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

しかし、クラスの一番上にある場合は、(スペースを節約するために) エイリアスを定義します。

using MsgType = ValidationMessage.EnumValidationMessageType;

次に、結果のコード行:

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

エラーが表示されます:

ここに画像の説明を入力 "デリゲート ' System.Func<ValidationMessage, int, bool>' は引数を 1 つ取りません". それについて奇妙なのは、それが私が使用しているデリゲートではないということです。' System.Func<ValidationMessage, bool>' のオーバーロードを使用してい.Where<>()ます - エイリアスを使用していなかったときと同じです。

エイリアスが使用されている他の場所では正常に機能することに注意してください。これらの linq デリゲート内でのみ壊れます。なぜこうなった?

4

1 に答える 1

2

プログラムを実行しようとすると、これらのエラーはすべて解消され、型エイリアス宣言に関するエラーが 1 つ表示されました。

問題は、ValidationMessage.EnumValidationMessageTypeさらに上で宣言された名前空間内に型が存在することでした。

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

もちろん、C# は以前の名前空間のインクルージョンに基づいて型がどこから来ているのかを把握できないため、完全に説明する必要がありました。

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

それをしたら、他の問題はなくなりました。

上記の三項演算子でエイリアスを使用していた場所でVSがエラーを表示しなかったという事実と相まって、linqステートメントから出てくる奇妙なエラーに巻き込まれて混乱しただけだと思います。そこに明らかなエラーがあります。

ヒント nemesv をありがとう - 設計時のコンパイラを信頼するよりもよく知っている必要があります。

于 2012-06-28T17:38:41.413 に答える