収量リターン列挙者の方法を備えたビジュアルスタジオでのデバッグウォッチの問題

StackOverflow https://stackoverflow.com/questions/2927519

質問

Anを返す方法があります IEnumerable<> これを使用して構築します yield return 構文:

namespace Validation
{
    public class UserValidator
    {
        public IEnumerable<ValidationError> Validate(User user)
        {
            if (String.IsNullOrEmpty(user.Name))
            {
                yield return new ValidationError("Name", ValidationErrorType.Required);
            }

            [...]

            yield break;
        }
    }
}

メソッドにブレークポイントを置いた場合、各行を踏むことができますが、時計または直接のウィンドウを使用して変数の値を表示しようとすると、このエラーが表示されます。

ネストされたタイプ 'validation.uservalidator'を介して、外側のタイプ 'validation.uservalidator.validate'の非静的メンバーにアクセスできません。

なぜこれがなぜなのか、そして私がそれを回避できる方法を知っていますか?

役に立ちましたか?

解決

わかりました、それを試してみました、そして私はあなたが何を意味するのかわかります。それは痛いです!私はそれがコンパイラが(ネストされたクラスなどを作成する)舞台裏の作業に関係していると思われます。 yield. 。それを回避する1つの方法(私が元々あなたのコードを試した方法)は、 Validate メソッド静的ですが、明らかにそれはデザインには良くありません。

エラーメッセージが非常に鈍角である理由は、次のような組み合わせであると思います。

  1. 生成されたクラスはソースに存在しないため、VSにはそれらを参照する名前はありません。
  2. IIRC、コンパイラによって生成された名前には、C#識別子では違法な文字が含まれていますが、基礎となるフレームワークタイプシステムで有効です。

私は今リフレクターが手元にあるので、確認できませんが、あなたが光のマゾヒズムのスポットのように感じているなら、あなたのアセンブリを振り返り、コンパイラが私たちに単なる人間を素敵に使うように書くコードを見てみましょう構文のような砂糖 yield return :) Webには、正確にすべてがどのように機能するかについて、多くの情報があります。

編集: もう少し検索した後、いくつかのより良いもの:
http://blogs.msdn.com/b/ericlippert/archive/tags/iterators/
http://csharpindepth.com/articles/chapter6/iteratorblockimplementation.aspx

他のヒント

メソッドは、列挙するまで実行されません。

var p = UserValidator.Validate(user).ToList();

これでコードをデバッグできます。

私は同様の問題を抱えており、私がしたことは、実装を変更して要素のリストを構築し、リストを返すことです。

それにより、私はバグを見つけて、それを修正することができました。バグが修正された後、実装を利回りのリターンに戻します。

痛い。

ライセンス: CC-BY-SA帰属
所属していません StackOverflow
scroll top