You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何在不重定义MySqrt时,基于double?的空值控制C#程序流程?

在C#中基于可空类型返回值控制程序流程的解决方案

问题背景

在C#中,值类型后添加问号表示该类型为可空值类型(如double?),这类类型既可以存储对应值类型的有效数据,也可以为null。例如已有如下返回可空类型的函数:

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

若仅需基于返回值完成变量赋值,可使用??空合并运算符;但要基于返回值是否为null控制分支流程(比如调用要求传入非空double参数的DrawSquare函数),直接将返回值赋值给double变量会触发编译错误,若将变量声明为double?又无法适配DrawSquare的参数要求。

可行解决方案

1. 利用可空类型的HasValue和Value属性

先将返回值存储为double?类型,通过HasValue判断是否存在有效值,存在时用Value提取非空的double值:

void DrawSquareWithArea(double area)
{
    double? sideLength = MySqrt(area);
    if (sideLength.HasValue)
    {
        DrawSquare(sideLength.Value);
    }
    else
    {
        DisplayErrorFeedback();
    }
}

这种方式是处理可空类型的传统写法,逻辑清晰易懂,兼容所有C#版本。

2. 使用模式匹配(C# 7.0及以上)

借助C# 7.0引入的模式匹配语法,可以直接判断可空类型是否包含有效值,并同时完成赋值:

void DrawSquareWithArea(double area)
{
    if (MySqrt(area) is double sideLength)
    {
        DrawSquare(sideLength);
    }
    else
    {
        DisplayErrorFeedback();
    }
}

这种写法更简洁,无需显式声明可空类型变量,编译器会自动处理类型转换,代码可读性更高。

3. 结合??运算符与异常处理(适合特定场景)

如果无效输入需直接抛出异常而非显示反馈,可使用??配合异常抛出:

void DrawSquareWithArea(double area)
{
    double sideLength = MySqrt(area) ?? throw new ArgumentException("面积值必须大于0");
    DrawSquare(sideLength);
}

但此方式仅适用于无需分支显示反馈的场景,无法覆盖需要执行错误处理逻辑的情况。


内容的提问来源于stack exchange,提问作者Max

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.05 12:11:05