返回myVar与return(myVar)之间有区别吗?

时间:2010-02-02 18:31:02

标签: c# syntax

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

我一直都这么做:

return myRV;

是否有所不同:

return (myRV);

4 个答案:

答案 0 :(得分:229)

更新:这个问题是the subject of my blog on 12 April 2010。谢谢你这个有趣的问题!

在实践中,没有区别。

理论中可能会有所不同。 C#规范中有三个有趣的点,这可能会产生差异。

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

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

F1显然是合法的。是F2吗?从技术上讲,没有。 The spec在第6.5节中说,存在从 lambda表达式到兼容委托类型的转换。那是 lambda表达式吗?不。它是带括号的表达式,其中包含 lambda表达式

Visual C#编译器在此处发生小规格违规并丢弃括号。

第二

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

F3是合法的。是F4吗? No. 7.5.3节规定括号表达式可能不包含方法组。同样,为方便起见,我们违反了规范并允许转换。

第三

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

F5是合法的。是F6吗?不。规范声明存在从字面零到任何枚举类型的转换。 “(0)”不是字面零,它是一个括号后跟字面零,后跟括号。我们违反了这里的规范,实际上允许任何编译时常量表达式等于零,而不仅仅是字面零。

所以在每种情况下,我们都允许你逃脱它,即使技术上这样做是非法的。

答案 1 :(得分:40)

当存在括号可能对程序行为产生影响时,存在极端情况:

1

using System;

class A
{
    static void Foo(string x, Action<Action> y) { Console.WriteLine(1); }
    static void Foo(object x, Func<Func<int>, int> y) { Console.WriteLine(2); }

    static void Main()
    {
        Foo(null, x => x()); // Prints 1
        Foo(null, x => (x())); // Prints 2
    }
}

2

using System;

class A
{
    public A Select(Func<A, A> f)
    {
        Console.WriteLine(1);
        return new A();
    }

    public A Where(Func<A, bool> f)
    {
        return new A();
    }

    static void Main()
    {
        object x;
        x = from y in new A() where true select (y); // Prints 1
        x = from y in new A() where true select y; // Prints nothing
    }
}

3

using System;

class Program
{
    static void Main()
    {
        Bar(x => (x).Foo(), ""); // Prints 1
        Bar(x => ((x).Foo)(), ""); // Prints 2
    }

    static void Bar(Action<C<int>> x, string y) { Console.WriteLine(1); }
    static void Bar(Action<C<Action>> x, object y) { Console.WriteLine(2); }
}

static class B
{
    public static void Foo(this object x) { }
}

class C<T>
{
    public T Foo;
}

希望你在实践中永远不会看到这一点。

答案 2 :(得分:26)

不,除了语法之外没有区别。

答案 3 :(得分:3)

回答这样的问题的好方法是使用Reflector并查看生成IL的内容。您可以通过反编译程序集来学习很多关于编译器优化的知识。