为什么C#不允许我将void方法作为return语句的一部分调用?

Mat*_*man 37 c# void

我很好奇,如果有一个合理的原因,当调用方法的返回类型也是void时,为什么C#不支持调用void方法作为return语句的一部分.

public void MethodA() 
{ 
    return; 
}

public void MethodB() 
{
    return MethodA();
}
Run Code Online (Sandbox Code Playgroud)

所以我们通常会看到这个:

public void MethodMeh() 
{
    if (expression) 
    {
        MethodA();
        return;
    }

    // Do more stuff
}
Run Code Online (Sandbox Code Playgroud)

......当我们可以使用它时:

public void MethodAwesome() 
{
    if (expression) 
        return MethodA();

    // Do more stuff
}
Run Code Online (Sandbox Code Playgroud)

由于C#如何处理void,这是一种语言限制吗?

dan*_*n04 39

因为它只是语言定义的方式.

方法可以使用return语句将控制权返回给其调用者. 在返回的方法中void,return语句不能指定表达式.在返回非的方法中void,return语句必须包含计算返回值的表达式.

这是一个随意的决定(可能是为了与ANSI C及其他后代兼容),而其他语言则以不同的方式做事.

例如,在Python中,所有函数都返回一个值.如果你执行一个return没有值的语句,或者让控制到达函数的末尾,那就像你写的一样return None.

相反,Pascal将术语限制为function具有返回值的子程序; 如果你不想退货,你可以使用procedure.

  • 实际上,出于模板原因,C++确实允许它. (10认同)

Ry-*_*Ry- 28

void缺乏信息; 归还它没有任何意义.它不是类型*,与其他语言不同,它不是一个值.不,这不是一个真正的限制.

好吧,正如@Lucas指出的那样.这是一种信息类型; 它实际上并不代表通常意义上的类型.你不能拥有一个.

  • 实际上,它*是*类型:`System.Void`.但它确实是一种非常特殊的类型...... (10认同)
  • 在C++中,它实际上是模板化场景的限制,因此在这些情况下允许它.只使用单个值而不是"void"的`unit`类型将是一个更好的解决方案,当然 - 结果代码将完全相同. (5认同)
  • @MattBeckman:不,你刚回来.VB.NET使这种区分更加清晰. (3认同)

svi*_*ick 7

你的问题是相当多约之间的差异void类型unit类型(像F#的函数式语言最常见的).

基本上,void不是真正的类型.虽然System.Void出于反射的目的,你不能void在大多数你可以使用真实类型的地方使用:你不能拥有类型的变量,void你不能在泛型中使用它(即使能够写入Func<void>将是有时非常有用).

另一方面,unit在F#中是一个真实的类型:它有一个(单个)值(称为()),你可以写相当于Func<void>(写的unit -> unit,第一个unit意思是"没有参数",类似于void在C中的参数列表中写入)你可以有类型的变量unit.例如:

let unitTest (f : unit -> unit) =
    let nothing : unit = f()
    ()
Run Code Online (Sandbox Code Playgroud)

最后一行实际上表明,在F#中,您有时必须明确返回unit.

  • `Func <void>`也称为`Action` :) (2认同)