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

Kha*_*laf 8 c# optional-parameters

快速问题:

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 }
}
Run Code Online (Sandbox Code Playgroud)

我应该能够做到这一点:

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
                }
            }

        }
    }
Run Code Online (Sandbox Code Playgroud)

那为什么这不起作用:

public MyClass(double _x = null, double _y = null, double _z = null, Color _color = null)
{
   // ..
}
Run Code Online (Sandbox Code Playgroud)

告诉我:

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

Dav*_*d L 11

double是一种值类型.您需要将其包装Nullable<T>?用于速记,以表明它可以为空.

public MyClass(double? _x = null, double? _y = null, double? _z = null, Color _color = null)
{
   // ..
}
Run Code Online (Sandbox Code Playgroud)

  • `Nullable <T>`(如我的答案中链接的文档中所述)公开`.Value`以允许您获取基础值类型.请记住,如果要执行此操作,您还需要检查`.Nullable <T> .HasValue`并处理适当的null的情况. (2认同)