ฉันกำลังดูตัวอย่างรหัส C # และสังเกตเห็นว่าตัวอย่างหนึ่งห่อผลตอบแทนไว้ใน ()
ฉันทำมาตลอด:
return myRV;
มีความแตกต่างในการทำ:
return (myRV);
ฉันกำลังดูตัวอย่างรหัส C # และสังเกตเห็นว่าตัวอย่างหนึ่งห่อผลตอบแทนไว้ใน ()
ฉันทำมาตลอด:
return myRV;
มีความแตกต่างในการทำ:
return (myRV);
คำตอบ:
UPDATE: คำถามนี้เป็นเรื่องของการบล็อกของฉันบน 12 เมษายน 2010 ขอบคุณสำหรับคำถามที่น่าขบขัน!
ในทางปฏิบัติไม่แตกต่างกัน
ในทางทฤษฎีอาจมีความแตกต่าง มีประเด็นที่น่าสนใจสามประการในข้อกำหนด C # ซึ่งอาจทำให้เกิดความแตกต่างได้
ขั้นแรกการแปลงฟังก์ชันที่ไม่ระบุชื่อเพื่อมอบหมายชนิดและแผนภูมินิพจน์ พิจารณาสิ่งต่อไปนี้:
Func<int> F1() { return ()=>1; }
Func<int> F2() { return (()=>1); }
F1
ถูกกฎหมายอย่างชัดเจน คือF2
? ในทางเทคนิคไม่ ข้อมูลจำเพาะระบุไว้ในส่วน 6.5 ว่ามีการแปลงจากนิพจน์แลมบ์ดาเป็นประเภทผู้ร่วมประชุมที่เข้ากันได้ นั่นคือการแสดงออกของแลมด้าหรือไม่? เลขที่มันเป็นแสดงออกวงเล็บที่มีการแสดงออกแลมบ์ดา
คอมไพเลอร์ 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)
" ไม่ใช่ศูนย์ตามตัวอักษร แต่เป็นวงเล็บตามด้วยศูนย์ตัวอักษรตามด้วยวงเล็บ เราละเมิดข้อกำหนดที่นี่และอนุญาตให้นิพจน์คงที่ของเวลาคอมไพล์มีค่าเท่ากับศูนย์ไม่ใช่แค่ศูนย์ตามตัวอักษรเท่านั้น
ดังนั้นในทุกกรณีเราอนุญาตให้คุณหลีกเลี่ยงแม้ว่าในทางเทคนิคแล้วการทำเช่นนั้นจะผิดกฎหมาย
มีหลายกรณีที่การมีวงเล็บอาจมีผลต่อพฤติกรรมของโปรแกรม:
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;
}
หวังว่าคุณจะไม่เห็นสิ่งนี้ในทางปฏิบัติ
ไม่ไม่มีความแตกต่างใด ๆ นอกเหนือจากการสังเคราะห์
วิธีที่ดีในการตอบคำถามเช่นนี้คือการใช้ตัวสะท้อนแสงและดูว่า IL สร้างอะไรได้บ้าง คุณสามารถเรียนรู้มากมายเกี่ยวกับการปรับแต่งคอมไพลเลอร์และอื่น ๆ ได้โดยการถอดรหัสแอสเซมบลี