【问题标题】:Why a value of type null cannot be used as a default parameter with type double?为什么 null 类型的值不能用作 double 类型的默认参数?
【发布时间】:2016-11-24 02:44:27
【问题描述】:

快速提问:

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'

【问题讨论】:

  • 如果我学到了一件事,那就是反对者永远不会看到这个问题,因为他不会回到你的帖子:D
  • @Vucko 但是像你这样的专业用户会来看它,会知道这是不公平的,因为没有任何问题而且这 IS 很有用,并且支持它;)
  • 是的,我认为这是一个很酷的问题,并投了赞成票:D
  • 谢谢。现在回到 Android :P @Vucko
  • 哈哈,对了,伙计!我也喜欢 C++、C# 和 C,别逼我 :D

标签: c# optional-parameters


【解决方案1】:

double 是一个value type。您需要将其包装在 Nullable<T>? 中作为简写,以表明它可以为空。

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

【讨论】:

  • 嗨,大卫,但在尝试将参数的值(双精度?)分配给私有时,它说“我无法将 double? 转换为 double”会员(双)
  • Nullable<T> (如我的答案中链接的文档中所述)公开.Value 以允许您获取基础值类型。请记住,如果您要这样做,您还需要检查.Nullable<T>.HasValue 并适当处理它为空的情况。
  • 使用if (_x.HasValue) { do something with _x.Value}
  • 看起来将它与构造函数一起使用不是一个好主意,尤其是我有所有双参数
  • 可选参数可以非常方便,但是当它们数量很多时,它们往往是糟糕的类设计的标志。通常这是违反单一职责原则的。
【解决方案2】:

正如大卫在他的回答中解释的那样,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; 
}

或者类似的东西。

【讨论】:

    猜你喜欢
    • 2015-12-20
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-06-24
    • 2021-10-28
    • 2021-11-12
    相关资源
    最近更新 更多