在我的自定义函数中返回double.NaN:这是一个好习惯吗?

0 c# floating-point nan

(关于返回NaN有一个类似的问题,但它没有回答这个问题)

我是初学者编码器(因此总是不确定什么是好习惯)而且我正在编写一种方法来计算在2d空间中移动的某个物体的方向角(这是用于Codingame挑战).为此,我写了一个方法

public static double GetAngle(double deltaX, double deltaY)
{
    if (deltaX==0 && deltaY==0) return double.NaN; //if not moving the direction is undefined
    //...
    //calculations etc
    return result;
}
Run Code Online (Sandbox Code Playgroud)

返回那样的NaN是一个好习惯吗?看似方便和合乎逻辑(对象不移动,因此没有速度,因此没有速度矢量),但不知何故,我觉得它可能会导致一些难以发现的错误,当这个方法用于其他计算时(当然我会使用NaN检查我记得的地方但仍然).如果有必要,这个方法可以返回0而不是NaN,我可以忍受.

Jon*_*eet 5

虽然在某些方面它是合乎逻辑的,但我建议更习惯的方法是使用a Nullable<double>,也写成double?:

public static double? GetAngle(double deltaX, double deltaY)
{
    if (deltaX == 0 && deltaY == 0)
    {
        return null;
    }
    // ...
    // Calculations etc
    return result;
}
Run Code Online (Sandbox Code Playgroud)

这可能与您为其他代码表达"非结果"的方式更加一致.

除了其他任何东西之外,返回类型double?而不是double强制调用者考虑无结果选项的事实 - 而调用返回NaN的方法并最终在其他地方偶然传播NaN值非常容易.