C#3.5中'??' - 运算符的奇怪行为

时间:2012-01-10 16:14:10

标签: c# .net-3.5 null-coalescing-operator

这是一个错误还是我解释'??' - 运算符错了?查看下面的获取属性和评论。

我正在使用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;
        }
    }

编辑:对于那些在新问题时看过这个问题的人,很抱歉,其中有些错误会让所有人感到困惑。

感谢所有伟大而快速的反馈!我现在明白了我犯的错误。的谢谢!

6 个答案:

答案 0 :(得分: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;

您稍后添加的??版本难以理解,我不会对其进行分析。我们先让?正确。

答案 1 :(得分:5)

如果必须使用??,请使用

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

但是一个简单的if也很好

答案 2 :(得分:3)

使用语法

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

如果_myTypeList为null,则返回List()类型的新MyType列表。然而,_myTypeList仍然为null。你没有初始化它。

而在第二种情况下,您实际上初始化_myTypeList然后返回它。

答案 3 :(得分: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 l将始终求值为true,因为_mytypeList永远不会被初始化,因此,您将始终返回一个新的List实例。

答案 4 :(得分: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设置为新列表,它只返回一个。您可以使用在A版中使用的相同语法使其等效:

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

答案 5 :(得分:1)

??运算符表示:如果左手操作数不是null,则操作的结果是左手操作数。否则,操作的结果是右手操作数。即:

foo = bar ?? frob

如果foo = bar,则为bar != null,否则为foo = frob