return myVar与return(myVar)之间是否有区别?

问题描述 投票:87回答:4

我在看一些示例C#代码,并注意到一个示例将返回值包装在()中。

我一直都做:

return myRV;

执行上有区别吗?

return (myRV);
c# syntax
4个回答
229
投票

更新:此问题为the subject of my blog on 12 April 2010。感谢您提出有趣的问题!

实际上,没有区别。

theory中可能有所不同。 C#规范中有三个有趣的地方,它们可能会有所不同。

首先,将匿名函数转换为委托类型和表达式树。考虑以下内容:

Func<int> F1() { return ()=>1; }
Func<int> F2() { return (()=>1); }

F1显然是合法的。是F2吗?从技术上讲,没有。 The spec在6.5节中说,存在从到兼容委托类型的转换。那是lambda表达式吗?否。它是一个括号括起来的表达式,其中包含一个lambda表达式Visual C#编译器在这里犯了一个小小的规范冲突,并为您舍弃了括号。

第二:

int M() { return 1; } Func<int> F3() { return M; } Func<int> F4() { return (M); }

F3是合法的。是F4吗?否。第7.5.3节指出,带括号的表达式不能包含方法组。再次,为了您的方便,我们违反了规范并允许进行转换。

第三:

enum E { None } E F5() { return 0; } E F6() { return (0); }

F5是合法的。是F6吗?否。规范指出,存在从文字零到任何枚举类型的转换。 “ (0)”不是立即数零,它是一个括号,后跟立即数零,然后是一个括号。我们在这里违反了规范,实际上允许任何

编译时常量表达式等于零

,而不仅仅是文字零。所以在每种情况下,即使从技术上讲,这样做都是违法的,我们都允许您摆脱它。

40
投票
在某些情况下,括号的存在会影响程序的行为:

26
投票
不,语法上没有其他区别。

3
投票
回答此类问题的一种好方法是使用Reflector并查看生成了什么IL。您可以通过反汇编程序集来了解有关编译器优化的很多知识。
© www.soinside.com 2019 - 2024. All rights reserved.