ฉันจะแปลงให้เป็นโมฆะintได้intอย่างไร สมมติว่าฉันมี 2 ประเภท int ดังนี้:
int? v1;
int v2;
ฉันต้องการที่จะกำหนดv1's v2มูลค่าให้กับ v2 = v1;จะทำให้เกิดข้อผิดพลาด ฉันจะแปลงv1เป็นv2อย่างไร
ฉันจะแปลงให้เป็นโมฆะintได้intอย่างไร สมมติว่าฉันมี 2 ประเภท int ดังนี้:
int? v1;
int v2;
ฉันต้องการที่จะกำหนดv1's v2มูลค่าให้กับ v2 = v1;จะทำให้เกิดข้อผิดพลาด ฉันจะแปลงv1เป็นv2อย่างไร
คำตอบ:
คำตอบอื่น ๆ ที่ถูกต้องทั้งหมด; ฉันแค่ต้องการเพิ่มอีกหนึ่งที่สะอาดกว่าเล็กน้อย:
v2 = v1 ?? default(int);
ใด ๆ ที่Nullable<T>สามารถแปลงได้โดยปริยายเพื่อTพิสูจน์ว่านิพจน์ทั้งหมดที่ถูกประเมินไม่สามารถส่งผลให้การกำหนดค่า null ให้กับ ValueType ดังนั้นตัวดำเนินการ null รวมกัน??เป็นเพียงไวยากรณ์น้ำตาลสำหรับผู้ประกอบการที่ประกอบไปด้วย:
v2 = v1 == null ? default(int) : v1;
... ซึ่งอยู่ในไวยากรณ์ของน้ำตาลสำหรับ if / else:
if(v1==null)
v2 = default(int);
else
v2 = v1;
นอกจากนี้ในฐานะของ. NET 4.0 Nullable<T>ยังมีวิธี "GetValueOrDefault ()" ซึ่งเป็นตัวรับสัญญาณที่ไม่ปลอดภัยซึ่งโดยทั่วไปแล้วจะทำการรวมกันเป็นโมฆะที่แสดงด้านบนดังนั้นสิ่งนี้ก็ใช้ได้เช่นกัน:
v2 = v1.GetValueOrDefault();
default(int)ความจำเป็นจริงๆ? มีอะไรผิดปกติกับง่ายๆ0?
defaultตามความเหมาะสม เลขศูนย์ไม่ถูกต้องเสมอเป็นค่าเริ่มต้นน้อยกว่ามากดังนั้นหากคุณแทนที่intด้วยทั่วไปTคุณจะพบว่ารหัสของฉันทำงานในขณะที่ศูนย์ไม่ได้ ในบางเวอร์ชันของเฟรมเวิร์กในอนาคตdefaultอาจกลายเป็นโอเวอร์โหลดได้เช่นกัน หากและเมื่อสิ่งนั้นเกิดขึ้นรหัสที่ใช้ค่าเริ่มต้นจะสามารถใช้ประโยชน์ได้ง่ายในขณะที่ค่า Null ที่ชัดเจนหรือการกำหนดค่าศูนย์จะต้องเปลี่ยน
แบบนี้,
if(v1.HasValue)
v2=v1.Value
คุณสามารถใช้คุณสมบัติค่าสำหรับการมอบหมาย
v2 = v1.Value;
v1.HasValueก่อน
สิ่งที่คุณต้องการคือ ..
v2= v1.GetValueOrDefault();
หากคุณรู้ว่าv1มีค่าคุณสามารถใช้Valueคุณสมบัติ:
v2 = v1.Value;
การใช้GetValueOrDefaultเมธอดจะกำหนดค่าหากมีอย่างใดอย่างหนึ่งไม่เช่นนั้นค่าเริ่มต้นสำหรับประเภทหรือค่าเริ่มต้นที่คุณระบุ:
v2 = v1.GetValueOrDefault(); // assigns zero if v1 has no value
v2 = v1.GetValueOrDefault(-1); // assigns -1 if v1 has no value
คุณสามารถใช้HasValueคุณสมบัติเพื่อตรวจสอบว่าv1มีค่า:
if (v1.HasValue) {
v2 = v1.Value;
}
นอกจากนี้ยังมีการสนับสนุนภาษาสำหรับGetValueOrDefault(T)วิธีการ:
v2 = v1 ?? -1;
คุณไม่สามารถทำได้ถ้า v1 เป็นโมฆะ แต่คุณสามารถตรวจสอบกับผู้ให้บริการได้
v2 = v1 ?? 0;
GetValueOrDefault()
ดึงค่าของวัตถุ ถ้ามันเป็นโมฆะมันจะส่งกลับค่าเริ่มต้นของ int ซึ่งก็คือ 0
ตัวอย่าง:
v2= v1.GetValueOrDefault();
หากค่าเริ่มต้นสำหรับประเภทที่กำหนดเป็นผลลัพธ์ที่ยอมรับได้:
if (v1.HasValue)
v2 = v1.GetValueOrDefault();
หากคุณต้องการค่าเริ่มต้นที่แตกต่างกันเมื่อไม่ได้กำหนดผลลัพธ์:
v2 = v1.GetValueOrDefault(255); // or any valid value for int in place of 255
หากคุณต้องการคืนค่า (ไม่ว่าเมธอดจะล้มเหลวหรือไม่ก็ตาม):
v2 = v1.GetValueOrDefault();
.NET 4.7.2: GetValueOrDefault()ส่งคืนค่าฟิลด์โดยไม่ตรวจสอบใด ๆ
เท่าที่ฉันกังวลทางออกที่ดีที่สุดคือการใช้GetValueOrDefault()วิธีการ
v2 = v1.GetValueOrDefault();
การแปลง Int เป็นค่าที่ไม่สามารถแปลงได้นั้นสามารถทำได้ดังนี้:
v2=(int)v1;
เป็นไปได้ด้วย v2 = Convert.ToInt32(v1);
คุณสามารถทำได้
v2 = v1.HasValue ? v1.Value : v2;
การแปลงระหว่างที่เรียบง่ายv1และv2เป็นไปไม่ได้เพราะมีโดเมนที่มีขนาดใหญ่ของค่ากว่าv1 v2มันเป็นทุกอย่างที่v1สามารถถือรวมทั้งnullรัฐ ในการแปลงคุณต้องระบุอย่างชัดเจนว่าintจะใช้ค่าใดในการแมปnullสถานะ วิธีที่ง่ายที่สุดในการทำเช่นนี้คือ??ผู้ควบคุมเครื่อง
v2 = v1 ?? 0; // maps null of v1 to 0
สิ่งนี้สามารถทำได้ในรูปแบบยาว
int v2;
if (v1.HasValue) {
v2 = v1.Value;
} else {
v2 = 0;
}
ขึ้นอยู่กับบริบทการใช้งานของคุณคุณอาจใช้คุณสมบัติการจับคู่รูปแบบของ C # 7:
int? v1 = 100;
if (v1 is int v2)
{
Console.WriteLine($"I'm not nullable anymore: {v2}");
}
เนื่องจากบางคนกำลัง downvoting โดยไม่ต้องออกคำอธิบายฉันต้องการเพิ่มรายละเอียดบางอย่างเพื่ออธิบายเหตุผลในการรวมสิ่งนี้เป็นทางออกที่ทำงานได้
ตอนนี้การจับคู่รูปแบบของ C # 7ช่วยให้เราสามารถตรวจสอบประเภทของค่าและส่งค่าโดยปริยาย ในตัวอย่างด้านบน if-condition จะผ่านก็ต่อเมื่อค่าที่เก็บไว้ในv1นั้นเป็นชนิดที่เข้ากันได้กับประเภทสำหรับv2intซึ่งในกรณีนี้คือ มันดังต่อไปว่าเมื่อค่าสำหรับv1เป็นnullที่ถ้าสภาพจะล้มเหลวตั้งแต่ null intไม่สามารถมอบหมายให้ เพิ่มเติมอย่างถูกต้องไม่ได้เป็นnullint
ฉันต้องการเน้นว่าโซลูชันนี้อาจไม่ใช่ตัวเลือกที่ดีที่สุดเสมอไป ตามที่ฉันแนะนำฉันเชื่อว่าสิ่งนี้จะขึ้นอยู่กับบริบทการใช้งานที่แน่นอนของผู้พัฒนา หากคุณมีint?และต้องการดำเนินการตามเงื่อนไขกับมูลค่าของif-and-only-ifค่าที่กำหนดไม่เป็นโมฆะ (นี่เป็นครั้งเดียวเท่านั้นที่จะปลอดภัยการแปลง int ที่สามารถเปลี่ยนค่าได้เป็น int ปกติโดยไม่สูญเสียข้อมูล) การจับคู่รูปแบบอาจเป็นวิธีที่กระชับที่สุดวิธีหนึ่งในการทำเช่นนี้
HasValueเช็คของคุณโดยไม่ได้ตั้งใจ
มันจะกำหนดค่าของv1ถึงv2หากไม่เป็นโมฆะมิฉะนั้นจะใช้ค่าเริ่มต้นเป็นศูนย์
v2=v1??0
หรือด้านล่างเป็นวิธีอื่นในการเขียน
v2 = v1.HasValue?v1:0
ใน C # 7.1 และใหม่กว่าประเภทสามารถอนุมานได้โดยใช้defaultตัวอักษรแทนตัวdefaultดำเนินการเพื่อให้สามารถเขียนได้ดังนี้:
v2 = v1 ?? default;
int v2= Int32.Parse(v1.ToString());
v1เป็นคือnullอะไร?