【问题标题】:Is 'void' a valid return value for a function?'void' 是函数的有效返回值吗?
【发布时间】:2014-02-19 15:01:30
【问题描述】:
private void SaveMoney(string id...)
{
    ...
}

public void DoSthWithMoney(string action,string id...)
{
    if(action=="save") return SaveMoney(string id);
    ...
}

为什么 C# 不允许我通过公共函数返回私有函数的 void?它甚至是相同的数据类型“void”...

或者 void 不是一种数据类型?

以下代码真的是最短的解决方法吗?

if(action=="save") {
    SaveMoney(string id);
    return;
}

【问题讨论】:

  • 从字面上从来没有考虑过这个,如果你很懒,这是一个好主意:D
  • void 本身不是数据类型(void* 是另一回事)。如果函数返回 void 则意味着它不返回值(编译器不会采取步骤将任何值放入调用约定中指定的寄存器中)。所以你在这里尝试的是不正确的!!!
  • 我看不出编译器不允许这样做的任何原因;编译器准确地知道这里发生了什么。似乎很少有人会尝试这样做。
  • @Mr.Smith 编译器可以知道——但这只是语言定义的问题。在声明为void 的函数中(不是返回 void - 你不能返回void)你可能不是return 一个值(如果你能够像上面那样写它, void 将被视为一个值,但事实并非如此)。

标签: c# return void


【解决方案1】:

这不是解决方法,而是正确的方法。

【讨论】:

    【解决方案2】:

    void 不是一个实际的返回(数据)类型! void没有 结果。因此,即使您正在调用的方法也声明为 void,您也不能在声明为 void 的方法中返回值。

    我必须承认这将是一个不错的捷径,但这不是事情的运作方式:-)


    只是一个额外的想法:如果你想要什么被允许,void 将成为数据类型也是该数据类型的唯一可能值,因为return x; 被定义为返回值x 给调用者。所以return void; 会将值void 返回给调用者——根据定义这是不可能的。

    这与 null 不同,例如,null 是引用类型的有效值。

    【讨论】:

    • 为什么/如何void 具有价值void?如果里面什么都没有,那不就是一个大小为零的无类型数组吗?
    • 有人可能会说这是Is-ought fallacy 的情况。 C#可以通过在编译时将return SaveMoney(id); 重写为{SaveMoney(id);return;} 来允许这种特殊情况。我们已经看到使用foreach(在数组上使用时)的类似重写,甚至是for 的一些实例。它可能不会变得更好......
    • @Alexander 这个想法是因为方法声明被定义为声明要返回的 type (或者 void 如果没有返回值)。 return 被定义为独立使用而没有返回值,或者返回 。这将使void 既是类型又是值。
    • @Mr.Smith 当然可以。调用扩展方法是类似语法糖的另一个例子。我并不是说它不能完成 - 我只是说 void 关键字的使用将不再清晰。
    • 不是真的,因为我不写return void,而是return someFuncThatReturnsVoid(),它“返回一个void类型的值”,可以这么说。
    【解决方案3】:

    void 不是 C# 中的类型。在这种情况下,void 表示absence of a return type or value,因此您不能像第一个示例中那样将它与return 一起使用。

    这与 C 不同,例如,其中 void 可以表示 typeless or an unknown type

    【讨论】:

      【解决方案4】:

      即使这样可以编译,我也不推荐它。在这么小的方法中,发生了什么很清楚,但如果是更大的方法,下一个程序员会看到,眨眼,想“我认为这是一个 void 方法”向上滚动,确认,向下滚动,按照 SaveMoney 方法,发现它什么也没返回,等等。

      您的“解决方法”一目了然。

      【讨论】:

        【解决方案5】:

        只需将方法更改为布尔值并返回 0。

        【讨论】:

          猜你喜欢
          • 2016-08-28
          • 2012-05-05
          • 1970-01-01
          • 2017-07-13
          • 2012-07-01
          • 1970-01-01
          • 2021-06-27
          • 1970-01-01
          • 1970-01-01
          相关资源
          最近更新 更多