5

私はこのコードを持っています:

MyClass _localMyClass = MyClassDAO.GetMyClassByID(123) ?? new MyClass();

これは方法です:

    public static MyClass GetMyClassByID(int id)
    {
        var query = from m in ctx.MyClass
                    where m.MyClassID == id
                    select m;

        return query.FirstOrDefault<MyClass>();
    }

そのためFirstOrDefault()、「ctx」オブジェクトであるエンティティ フレームワーク コンテキストでヒットが見つかりません。したがって、返される「デフォルト」値は ですnull。これは、クエリのターゲットがクラスであるためです。

を使用したコードの最初のビットの結果は、次の??ように_localMyClassなります。私はそれがnew MyClass(). 代わりに、_localMyClassnull になります。さまざまな括弧のセットでロジックをグループ化しようとしましたが、それでもうまくいきません。

さらに奇妙です。MyClassDAO.GetMyClassByID(123) ?? new MyClass()デバッグ ブレーク ポイントを設定し、Visual Studio のウォッチ画面に をコピー アンド ペーストすると、結果はnew MyClass()ではなく になりnullます。

なぜこのように機能するのか、誰か説明できますか? メソッドの戻り値を認識せずnull、代わりにそのnew部分を使用するのはなぜですか?

4

3 に答える 3

2

私は以前にこの間違いを犯し、長い間私を困惑させたので、ただの推測です.

条件付きブレークポイントがあり、その条件付きブレークポイントに条件があります_localMyClass = nullか?

条件付きブレークポイントに書き込むつもりだったときに、そのようなことをしたことが==ありますが、その結果、デバッガーが値を null に設定しました。同様に、null に設定できるウォッチ値はありますか?

于 2011-04-21T18:00:13.037 に答える
1

わかりました、自己回答はすでに受け入れられているので、将来誰かが別の可能性のあるケースを必要とする場合のプロフォーマ回答:

 FirstOrDefault() 

実際には、オブジェクト参照の場合はデフォルト値を返しますが、 value-typesnullの場合はそうではありません。値型の場合 (考えてください: ) の方が良いでしょうMyClassstruct

  • ジェネリック メソッドでの default(T) のチェック
  • DefaultIfEmpty() 拡張機能を使用して特定の値を使用する
  • MyClass?nullable 型 (Nullable の略)を使用する

$0.02

于 2011-04-25T14:38:14.747 に答える
0

After closing and reopening Visual Studio, the code worked fine.

I'm using Visual Studio Ultimate 2010 w/ service pack 1.

I have had this happen in the past, and should have remembered to try it first. I have noticed that VS seems to behave strangely sometimes, especially when running the web application in debug, specifically when running the web app locally (from my local IIS) and attaching to w3wp.exe.

于 2011-04-25T13:20:35.160 に答える