在 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?是另一个编译器错误。
通过使用正确的类型(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)