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

时间:2016-07-20 18:43:20

标签: c# optional-parameters

快速提问:

MSDN - Named and Optional Arguments (C# Programming Guide)明确指出

  

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

所以不要这样:

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”类型的值不能用作默认参数,因为   没有标准转换来输入'double'

2 个答案:

答案 0 :(得分:11)

doublevalue type。您需要将其换成Nullable<T>?作为速记,以表明它可以为空。

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

答案 1 :(得分:3)

正如大卫在回答中解释的那样,Double不是一个可以为空的类型。要为其指定空值,您必须将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; 
}

或类似的东西。