具有可空操作符的Linq FirstOrDefault

时间:2014-05-22 15:52:02

标签: c# linq

当Linq的FirstOrDefault与可空操作符结合使用时,我的行为很奇怪。

这是测试用例:

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;

namespace ConsoleApplication43
{
    class Program
    {
        static void Main( string[] args )
        {
            var x = new List<Test>( );
            x.Add( new Test { x = 1 } );
            x.Add( new Test { x = 2 } );

            var c2 = x.FirstOrDefault( e => e.x == 3 ) ?? x.FirstOrDefault( e => e.x == 1 );


            var a = x.FirstOrDefault( e => e.x == 3 );
            var b = x.FirstOrDefault( e => e.x == 1 );
            var c1 = a ?? b;
        }

        class Test
        {
            public int x;
        }
    }
}

我希望c1和c2都具有相同的值,但c2总是返回null,即使是可空操作符的右侧也不是null。

有一个类似的问题,但与价值类型有关(在这种情况下为doubles

FirstOrDefault() unable to couple with ?? operator

在这种情况下,所有关于引用类型Test

1 个答案:

答案 0 :(得分:1)

我有可调节类型的调试器错误。当变量不为null时,调试器有时会显示null。我相信C#编译器在涉及可空类型时会进行一些转换和优化。调试器有时似乎无法遵循。

使用控制台打印出值。

我之所以这样做是因为您的代码应该可以正常运行(and Servy has confirmed this)。它必须是调试器问题或其他一些误解。