为什么null类型的值不能用作double类型的默认参数

本文关键字:类型 double 默认 参数 不能 null 为什么 | 更新日期: 2023-09-27 17:57:59

快速问题:

MSDN-命名和可选参数(C#编程指南)明确指出

"可选参数使您可以省略某些参数的参数。这两种技术都可以与方法、索引器、构造函数一起使用,和代表。"

因此,取而代之的是:

class MyClass
{
//..
public MyClass() { // Empty Constructor's Task }
public MyClass(SomeType Param1) { // 2nd Constructor's Task }
public MyClass(SomeType Param1, SomeType Param2) { // 3rd Constructor's Task }
}

我应该能够做到这一点:

class MyClass
    {
        //..
        public MyClass(SomeType Param1 = null, SomeType Param2 = null)
        {
            if (Param1)
            {
                if (Param2)
                {
                    // 3rd constructor's Task
                }
                else
                {
                    // 2nd constructor's Task
                }
            }
            else
            {
                if (!Param2)
                {
                    // Empty constructor's Task
                }
            }
        }
    }

那么为什么这不起作用:

public MyClass(double _x = null, double _y = null, double _z = null, Color _color = null)
{
   // ..
}

告诉我:

类型为"null"的值不能用作默认参数,因为没有标准转换为"双"类型

为什么null类型的值不能用作double类型的默认参数

double是一种值类型。您需要将它封装在Nullable<T>?中以进行简写,以表明它可以为null。

public MyClass(double? _x = null, double? _y = null, double? _z = null, Color _color = null)
{
   // ..
}

正如David在回答中解释的那样,Double不是一个可以为null的类型。为了给它分配一个空值,您必须将Double转换为System.Nullable<double>double?

完整的答案看起来像:

public void MyMethod(double? param = null) { }

这里明显的问题是,您不必只向它传递double值,而是必须向它传递一个double?值。

我不确定这个功能的确切范围,但您可以随时参考默认值。例如:

public void MyMethod(double param = double.MinValue) 
{ 
    if (param == double.MinValue) 
        return; 
}

或者类似的东西。