c# - هل هناك فرق بين إرجاع myVar مقابل العودة(myVar)؟




summary c# (3)

توجد حالات ركنية يمكن أن يؤثر فيها وجود الأقواس على سلوك البرنامج:

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;
}

آمل أنك لن ترى هذا في الممارسة.

https://code.i-harness.com

كنت أبحث في بعض الأمثلة على كود C # ، ولاحظت أن أحد الأمثلة كان يلف العائد في ().

لقد فعلت دائما للتو:

return myRV;

هل هناك فرق يفعل:

return (myRV);

حدث: كان هذا السؤال موضوع مدونتي في 12 نيسان 2010 . شكرا على السؤال مسلية!

في الواقع ، لا يوجد فرق.

نظريا يمكن أن يكون هناك فرق. هناك ثلاث نقاط مثيرة للاهتمام في مواصفات C # حيث يمكن أن يحدث هذا فرقًا.

أولا ، تحويل وظائف مجهولة لتفويض أنواع وأشجار التعبير. خذ بعين الاعتبار ما يلي:

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

F1 قانوني بشكل واضح. هل F2 ؟ من الناحية الفنية ، لا. توضح المواصفات في القسم 6.5 وجود تحويل من تعبير lambda إلى نوع مفوض متوافق. هل هذا تعبير لامدا ؟ لا ، إنه تعبير مقسم يحتوي على تعبير لامدا .

المحول البرمجي Visual C # يجعل انتهاك spec صغيرة هنا ويتجاهل الأقواس لك.

ثانيا:

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) " ليس هو الصفر الحرفي ، بل هو قوس يتبعه الصفر الحرفي ، متبوعًا بقوس. إننا نخرق المواصفات هنا ونسمح في الواقع بأي تعبير ثابت لوقت الترجمة يساوي الصفر ، وليس مجرد حرف حرفي.

لذلك في كل حالة ، نسمح لك بالابتعاد عنها ، حتى وإن كان ذلك من الناحية الفنية غير قانوني.


لا ، لا يوجد اختلاف بخلاف بنائي.





syntax