TryParse โดยไม่ใช้พารามิเตอร์ var


94

คุณลักษณะใหม่ใน C # 6.0 ช่วยให้สามารถประกาศตัวแปรภายในเมธอด TryParse ฉันมีรหัส:

string s = "Hello";

if (int.TryParse(s, out var result))
{

}

แต่ฉันได้รับข้อผิดพลาดในการคอมไพล์: ป้อนคำอธิบายภาพที่นี่

ฉันทำอะไรผิด? PS: ในการตั้งค่าโปรเจ็กต์ C # 6.0 และ. NET framework 4.6 ถูกตั้งค่าไว้

คำตอบ:


155

คุณลักษณะใหม่ใน C # 6.0 ช่วยให้สามารถประกาศตัวแปรภายในเมธอด TryParse

นิพจน์การประกาศถูกตัดออกจาก C # 6.0 และไม่ได้จัดส่งในรุ่นสุดท้าย ขณะนี้คุณไม่สามารถทำได้ มีข้อเสนอสำหรับ GitHubสำหรับ C # 7 (ดูสิ่งนี้เพื่อใช้อ้างอิงในอนาคต)

ปรับปรุง (07/03/2560)

ด้วยการเปิดตัว C # 7 อย่างเป็นทางการโค้ดต่อไปนี้จะรวบรวม:

string s = "42";

if (int.TryParse(s, out var result))
{
     Console.WriteLine(result);
}

4
ขอบคุณมากสำหรับข้อมูล! มันเป็นเรื่องเล็กน้อยที่ถูกตัดออกจากรุ่นสุดท้ายสำหรับฉันมันเป็นคุณสมบัติที่ดี
Anton23

2
@ Anton23 หวังว่ามันจะเข้าสู่ C # 7 แล้ว :)
Yuval Itzchakov

2
นั่นเป็นคุณสมบัติที่คาดหวังมากที่สุดสำหรับฉัน
Tuyen Pham

อยู่ใน C # 7 / VS2017 เป็นอย่างน้อย
ssmith

1
คุณไม่สามารถอ่านต่อไปได้อีกหนึ่งประโยค? คำตอบซึ่งระบุ C # 7 ยังอธิบายว่าถูกตัดออกจาก 6.0 ผู้คนยังคงพัฒนาใน C # 6.0
Fus Ro Dah

15

เพิ่งค้นพบโดยบังเอิญใน vs 2017 คุณสามารถทำได้เพื่อความกะทัดรัด:

if (!Int64.TryParse(id, out _)) {
   // error or whatever...
}

2
นั่นคือตัวดำเนินการทิ้ง
Patrick Hofman

9

นั่นเป็นคุณสมบัติใหม่จาก C # 7 ซึ่งเป็นคุณสมบัติที่ดีมากมักใช้ร่วมกับการจับคู่รูปแบบ คุณลักษณะนี้และอื่น ๆ อีกมากมายจะมีการประกาศในบล็อก C # ทีมมีอะไรใหม่ใน C # 7.0

สิ่งที่ทีมพยายามทำให้สำเร็จคือโค้ดที่ลื่นไหลมากขึ้น คุณจำบางกรณีที่รายการตัวแปรออกใช้เวลานานมากโดยไม่มีประโยชน์หรือไม่? ตัวอย่างสั้น ๆ :

int i;
Guid g;
DateTime d;
if (int.TryParse(o, out i)) { /*use i*/ }
else if (Guid.TryParse(o, out g)) { /*use g*/ }
else if (DateTime.TryParse(o, out d)) { /*use d*/ }

เห็นปัญหาไหม ไม่มีประโยชน์ที่จะให้ตัวแปรทั้งหมดนั่งอยู่ที่นั่นโดยไม่ทำอะไรเลย จำนวนบรรทัดสามารถตัดครึ่งโดยใช้ C # 7:

if (int.TryParse(o, out int i)) { /*use i*/ }
else if (Guid.TryParse(o, out Guid g)) { /*use g*/ }
else if (DateTime.TryParse(o, out DateTime d)) { /*use d*/ }

ไม่เพียงลดจำนวนบรรทัดเท่านั้น แต่ยังไม่มีรายการตัวแปรที่ไม่จำเป็นในขอบเขตที่คุณไม่ต้องการให้มีอีกด้วย วิธีนี้ป้องกันไม่ให้คุณใช้ตัวแปรที่คุณไม่ได้ตั้งใจจะใช้ แต่ตอนนี้คุณสามารถมองเห็นได้

คุณสมบัตินี้ยังมีประโยชน์กับการจับคู่รูปแบบในswitchคำสั่งเช่นในโค้ดนี้ (ซึ่งมีลักษณะการทำงานที่แตกต่างจากโค้ดด้านบน!)

switch (o)
{
    case int i: { /*use i*/ break; }
    case Guid g: { /*use g*/ break; }
    case DateTime d: { /*use d*/ break; }
}
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.