-1

これはバグですか、それとも「??」演算子の解釈が間違っていますか? 以下の get プロパティとコメントを確認してください。

C# .NET 3.5 を使用しています

    private List<MyType> _myTypeList;

    private List<MyType> MyTypeList
    {
        get
        {
            //The two code lines below should each behave as the three under, but they don't?
            //The ones uncommented are working, the commented result in my list always returning empty (newly created I suppose).

            //return _myTypeList ?? new List<MyType>();
            //return _myTypeList == null ? new List<MyType>() : _myTypeList;

            if (_myTypeList == null)
                _myTypeList = new List<MyType>();
            return _myTypeList;
        }
    }

編集:新しく尋ねられたときに質問を見たすべての人に申し訳ありませんが、そこにいくつかのエラーがあり、みんなを混乱させました。

素早いフィードバックをありがとうございます。私は今、私が犯したエラーを理解しました。ありがとう!

4

6 に答える 6

6

この行:

return _myTypeList == null ? new List<MyType>() : _myTypeList;

以下と同等です。

    if (_myTypeList == null)
        return new List<MyType>();
    return _myTypeList;

しない:

    if (_myTypeList == null)
        _myTypeList = new List<MyType>();
    return _myTypeList;

後で追加したの付いたバージョン??は判読できないため、分析しません。?まず始めましょう。

于 2012-01-10T16:16:37.133 に答える
5

使用する必要がある場合は、次??のように使用します

_myTypeList = _myTypeList ??  new List<MyType>();
return  _myTypeList;

しかし、単純な if も問題ありません

于 2012-01-10T16:17:48.150 に答える
3

構文を使用する場合

return _myTypeList == null ? new List<MyType>() : _myTypeList;

_myTypeList が null の場合、List() 型の新しい MyType List を返します。ただし、_myTypeList は null のままです。初期化はしません。

一方、2 番目のケースでは、実際に _myTypeList を初期化してから返します。

于 2012-01-10T16:19:08.023 に答える
1

あなたが示しているコードは、??を使用していません。オペレーター (合体オペレーター)。代わりに、三項演算子を使用しています。

試す

return _myTypeList ?? ( _myTypeList = new List<MyType>() );

代わりは。

これをチェックしてください:

        static void Main( string[] args )
        {
            var x = GetList ();

            if( _theList == null )
            {
                Console.WriteLine ("_theList is null");
            }
            else
            {
                Console.WriteLine ("_theList has been initialized.");
            }
            Console.ReadLine ();
        }

        private static List<int> _theList;

        public static List<int> GetList()
        {
            return _theList ?? ( _theList = new List<int> () );
        }

上記のコードは、「_theList が初期化されました」を出力します。

あなたのコメント行:

//return _myTypeList == null ? new List<MyType>() : _myTypeList;

_myTypeList をどこでも(怠惰に)初期化していないため、期待どおりに機能することはありません。
_myTypeList == nul_mytypeList は初期化されないため、l は常に true と評価されます。したがって、常に新しい List インスタンスが返されます。

于 2012-01-10T16:16:29.530 に答える
1

バージョン A:

return _myTypeList ?? (_myTypeList = new List<MyType>()); 

バージョン B:

return _myTypeList == null ? new List<MyType>() : _myTypeList; 

バージョン C:

if (_myTypeList == null) 
    _myTypeList = new List<MyType>(); 
return _myTypeList; 

A と C は同じように動作する必要があります。B はすべきではありません --_myTypeList新しいリストに設定せず、1 つだけを返します。バージョン A で使用するのと同じ構文を使用して、同等にすることができます。

return _myTypeList == null ? _myTypeList = new List<MyType>() : _myTypeList; 
于 2012-01-10T16:17:43.673 に答える
1

演算子の??意味: 左側のオペランドが でない場合、演算nullの結果は左側のオペランドになります。それ以外の場合、演算の結果は右側のオペランドです。すなわち:

foo = bar ?? frob

ならば、そうでなけれfoo = barば.bar != nullfoo = frob

于 2012-01-10T16:21:28.127 に答える