我很好奇,如果有一个合理的原因,当调用方法的返回类型也是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.
Ry-*_*Ry- 28
void缺乏信息; 归还它没有任何意义.它不是类型*,与其他语言不同,它不是一个值.不,这不是一个真正的限制.
好吧,正如@Lucas指出的那样.这是一种信息类型; 它实际上并不代表通常意义上的类型.你不能拥有一个.
你的问题是相当多约之间的差异的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.