在Linq表达式中使用可空类型

4
var quantSubset =
    from userAns in userAnalysis.AllUserAnswers
    join ques in userAnalysis.AllSeenQuestions on userAns.QID equals ques.QID
    where (ques.QuestionType == "QT")
    select new {
        QuestionLevel = ques.LevelID,
        TimeTaken = userAns.TimeTaken,
        Points = userAns.Points,
        UsedWeapon = (userAns.UsedBy2 && userAns.UsedHint),
        WasCorrect = userAns.WasCorrect.HasValue ? userAns.WasCorrect.Value : null
    };

在我的选择表达式中,我想选择一个可空类型的WasCorrect(表达式的最后一部分),但显然我不能按照我目前尝试的方式进行。

我如何将WasCorrect作为可空类型获取?

我尝试了?WasCorrect,但这也不会在Visual Studio中产生错误。


你遇到的实际错误是什么? - leppie
1
does ?WasCorrect = userAns.WasCorrect not work? 这段代码是否无法正常工作? - RPM1984
如果我这样做的话,会得到以下错误:语法错误,需要“,”。 - shashi
2个回答

6

您需要将 null 值显式转换为可空类型:

WasCorrect = userAns.WasCorrect.HasValue ?
    userAns.WasCorrect.Value : (TheTypeName?)null

否则,C# 将不知道条件表达式应该是哪种类型。 除此之外,这段代码完全是多余的。你可以简单地写成:
WasCorrect = userAns.WasCorrect

1
@RPM:当编译器需要推断类型时,你就需要这样做。例如:var val = null; //null是什么类型? - Jeff Mercado
@Konrad 嗯,我以前的代码就像你说的那样编写,但每当它遇到一个空值时,它就会抛出异常。请参见http://msdn.microsoft.com/en-us/library/1t3y8s4s.aspx上的详细信息。 - shashi
@sassyboy:你链接的页面应该看到哪些细节?我写的代码从来没有抛出异常。你可能是误写了WasCorrect = userAns.WasCorrect.Value - Konrad Rudolph
有些迹象表明,当值为null时,他试图将其显式转换为bool。 var b =(bool)x.WasCorrect;(或任何类型它是) - Jeff Mercado
@konrad 好的,我的错。几天前我写了一个 if 条件,if (userAns.WasCorrect),当值为空时出现了错误,所以从那以后我一直在检查是否存在 (userAns.WasCorrect.HasValue)。让我试试你指出的方法。 - shashi
是的,它有效...所以我猜它在分配方面运行良好,但是现在在条件方面...有道理...谢谢大家.. - shashi

1

你必须具备编写的能力

select new { WasCorrect = userAns.WasCorrect }

如果userAns.WasCorrectNullable<bool>

该代码可以顺利执行:

class Test {
    public bool? NullableBool { get; set;}
}

class MainClass
{
    public static void Main ()
    {
        Test t1 = new Test { NullableBool = true };
        var a1 = new { NB = t1.NullableBool };

        Test t2 = new Test { NullableBool = null };
        var a2 = new { NB = t2.NullableBool };
    }
}

是的,当然。我只是把这个作为答案发布是为了让证明代码适合。 - Dan Abramov

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接