根据“double?”是否为空来确定程序流程

Max*_*Max 0 c#

在 C# 中,您可以向类型附加问号以指示它可以保存类型的值或返回 null:

double? MySqrt(double a)
{
    return (a > 0.0) ? Math.Sqrt(a) : null;
}

Console.WriteLine(MySqrt(4.5));     // 2.1213203435596424
Console.WriteLine(MySqrt(-4.5));    // a blank line
Run Code Online (Sandbox Code Playgroud)

现在,如果我想将此函数的结果作为变量赋值的条件,我可以使用??运算符,例如

double b = MySqrt(-2.0) ?? 0.0;
Console.WriteLine(b);     // 0
Run Code Online (Sandbox Code Playgroud)

但是,如果不重新定义MySqrt我如何根据是否MySqrt返回来控制更大的编程流程(而不仅仅是单个变量赋值) null

例如,以下内容会产生编译器错误:

void DrawSquareWithArea(double area)
{
    double sideLength = MySqrt(area);
    if (sideLength != null)
    {
        // Draw a square on the screen
        DrawSquare(sideLength);
    }
    else
    {
        // Display some visual feedback indicating that input was invalid
        DisplayErrorFeedback();
    }
}
// error CS0266: Cannot implicitly convert type 'double?' to 'double'. An explicit conversion exists (are you missing a cast?)
Run Code Online (Sandbox Code Playgroud)

请注意,该函数在这里DrawSquare()需要一个double参数,因此更改sideLength为 adouble?是另一个编译器错误。

kni*_*ttl 6

通过使用正确的类型(Nullable<double>又名double?)。非空值可以通过属性(这里Value有类型)来访问:double

void DrawSquareWithArea(double area)
{
    double? sideLength = MySqrt(area);
    if (sideLength != null) // or: if (sideLength.HasValue)
    {
        // Draw a square on the screen
        DrawSquare(sideLength.Value);
    }
    else
    {
        // Display some visual feedback indicating that input was invalid
        DisplayErrorFeedback();
    }
}
Run Code Online (Sandbox Code Playgroud)

或者让编译器推断类型:

var sideLength = MySqrt(area);
Run Code Online (Sandbox Code Playgroud)