คำถามติดแท็ก nullable-reference-types

สำหรับปัญหาที่เกี่ยวข้องกับประเภทการอ้างอิงที่เป็นโมฆะของ C # 8

3
อะไรคือ ?[]? ไวยากรณ์ใน C #?
ขณะที่ผมกำลังศึกษาผู้ร่วมประชุมที่เป็นจริงในระดับนามธรรมDelegate.csผมเห็นวิธีการต่อไปในที่ที่ฉันไม่เข้าใจ เหตุใดค่าส่งคืนจึง?ถึงแม้ว่ามันเป็นชนิดการอ้างอิง ( คลาส ) อยู่แล้ว ?[]? ความหมายกับพารามิเตอร์ คุณอธิบายได้ไหม public static Delegate? Combine(params Delegate?[]? delegates) { if (delegates == null || delegates.Length == 0) return null; Delegate? d = delegates[0]; for (int i = 1; i < delegates.Length; i++) d = Combine(d, delegates[i]); return d; }

4
เหตุใดรหัสนี้จึงให้คำเตือน“ การอ้างอิงโมฆะการอ้างอิงที่เป็นไปได้ที่เป็นไปได้”
พิจารณารหัสต่อไปนี้: using System; #nullable enable namespace Demo { public sealed class TestClass { public string Test() { bool isNull = _test == null; if (isNull) return ""; else return _test; // !!! } readonly string _test = ""; } } เมื่อผมสร้างนี้เส้นที่มีเครื่องหมายให้เตือนเรียบเรียง:!!!warning CS8603: Possible null reference return. ฉันพบว่ามันสับสนเล็กน้อยซึ่ง_testอ่านได้อย่างเดียวและเริ่มต้นว่าไม่ใช่ค่าว่าง หากฉันเปลี่ยนรหัสเป็นสิ่งต่อไปนี้คำเตือนจะหายไป: public string …

3
วิธีปฏิบัติที่ดีที่สุดสำหรับการใช้ประเภทข้อมูลอ้างอิงที่เป็นโมฆะสำหรับ DTO
ฉันมี DTO ซึ่งบรรจุด้วยการอ่านจากตาราง DynamoDB พูดว่าตอนนี้ดูเหมือนว่านี้: public class Item { public string Id { get; set; } // PK so technically cannot be null public string Name { get; set; } // validation to prevent nulls but this doesn't stop database hacks public string Description { get; set; } // can …

2
วิธีการใช้ C # 8.0 ชนิดอ้างอิงที่สามารถลบล้างได้ด้วยโมเดล Entity Framework Core ได้อย่างไร
ฉันเปิดใช้งาน C # 8.0 ประเภทการอ้างอิงที่เป็นโมฆะในโครงการ. NET Core 3.0 โครงการใช้ Entity Framework Core 3.0 เพื่อเข้าถึงฐานข้อมูล ต่อไปนี้เป็นตัวแบบข้อมูลที่หัวเรื่องไม่ควรเป็นโมฆะ public class Vehicle { public int Id { get; private set; } public string Title { get; private set; } // Entity Framework Core is instructed to bind to the private _drivers field in a …

1
วิธีการใช้. NET reflection เพื่อตรวจสอบชนิดอ้างอิง nullable
C # 8.0 แนะนำประเภทอ้างอิงที่ไม่มีค่า นี่คือคลาสธรรมดาที่มีคุณสมบัติเป็นโมฆะ: public class Foo { public String? Bar { get; set; } } มีวิธีการตรวจสอบทรัพย์สินชั้นใช้ประเภทอ้างอิง nullable ผ่านการสะท้อน?

2
ฉันสามารถบอกอ้างอิง C # nullable ว่าวิธีการตรวจสอบเป็นโมฆะได้อย่างมีประสิทธิภาพในเขตข้อมูล
พิจารณารหัสต่อไปนี้: #nullable enable class Foo { public string? Name { get; set; } public bool HasName => Name != null; public void NameToUpperCase() { if (HasName) { Name = Name.ToUpper(); } } } ในการชื่อ = ชื่อ. ToUpper () ฉันได้รับคำเตือนว่าชื่อเป็นการอ้างอิงโมฆะที่เป็นไปได้ซึ่งไม่ถูกต้องชัดเจน ฉันสามารถแก้ไขคำเตือนนี้ได้โดยการใช้ HasName ดังนั้นเงื่อนไขก็คือ (Name! = null) มีวิธีใดบ้างที่ฉันสามารถสั่งให้คอมไพเลอร์ได้ว่าการตอบสนองที่แท้จริงจาก HasName แสดงถึงข้อ จำกัด ที่ไม่สามารถลบล้างได้ในชื่อ? …

1
Nullability ที่ไม่รู้จักใน C # 8 คืออะไร
ใน C # 8.0 เราสามารถมีประเภทอ้างอิงที่เป็นโมฆะ เอกสารระบุว่ามีความผิดประเภท 4 ประเภท 3 รายการแรกค่อนข้างชัดเจน แต่ฉันไม่เข้าใจจุดที่ "ไม่ทราบ" เอกสารบอกว่ามันใช้กับยาชื่อสามัญ แต่เมื่อฉันพยายามเรียกวิธีการเกี่ยวกับตัวแปรที่ไม่มีข้อ จำกัด ของประเภท T ในข้อมูลทั่วไปมันแค่เตือนราวกับว่าประเภทนั้นเป็นโมฆะ ฉันไม่เห็นความแตกต่างระหว่างที่ไม่รู้จักและไม่สามารถใช้ได้ ทำไมไม่รู้จักอยู่? มันแสดงให้เห็นตัวเองได้อย่างไร

5
ประเภทอ้างอิงที่ไม่เป็นโมฆะใน C # 8 สามารถเป็นโมฆะในรันไทม์หรือไม่
ดูเหมือนว่าสำหรับฉันไม่มีการรับประกันว่าตัวแปรที่ไม่เป็นโมฆะจะไม่มีโมฆะ ลองนึกภาพฉันมีชั้นเรียนที่มีคุณสมบัติหนึ่งที่ไม่เป็นโมฆะ: public class Foo { public Foo(string test) { Test = test; } public string Test {get;set;} } ตอนนี้อาจดูเหมือนว่าตอนนี้ไม่สามารถเป็นค่าว่างได้ แต่ถ้าเราอ้างอิงคลาสนี้กับไลบรารี่อื่นที่ไม่ได้ใช้บริบทที่ไม่มีค่าใด ๆ จะไม่มีสิ่งใดหยุดมันจากการส่งค่า null ในนั้น ถูกต้องหรือมีการตรวจสอบรันไทม์บางอย่างเช่นกันซึ่งอาจทำให้แน่ใจได้

1
ข้อมูลประเภทการอ้างอิงที่เป็นโมฆะไม่ถูกเปิดเผยจาก FirstOrDefault
ฉันต้องการทดสอบคุณลักษณะการอ้างอิงชนิด nullableใหม่ใน C # 8.0 ฉันเริ่มโครงการใหม่ที่กำหนดเป้าหมายเป็น. NET Core 3.0 เปิดใช้งานประเภทการอ้างอิง nullable ใน.csprojไฟล์และเริ่มการเข้ารหัส ฉันสร้างรายการที่เรียบง่ายที่จะใช้เวลาstring[]และการส่งกลับในอาร์เรย์ที่เท่าเทียมกันstring abcตอนนี้เนื่องจากฉันไม่แน่ใจว่าabcมีอยู่จริงในอาร์เรย์ฉันใช้FirstOrDefault()ซึ่งควรเริ่มต้นnullหากไม่พบการจับคู่ using System; using System.Linq; public string FindArgument(string[] args) { var arg = args.FirstOrDefault(x => x == "abc"); return arg; } วิธีการส่งกลับของฉันstringซึ่งควรในขณะนี้เป็นที่ไม่ใช่ nullableประเภท เนื่องจากFirstOrDefault()อาจส่งคืนnullฉันคาดหวังว่าวิธีการข้างต้นให้คำเตือนเมื่อส่งกลับตัวแปรอาจเป็นโมฆะ argมันไม่ใช่. เมื่อมองที่ลายเซ็นต์สำหรับFirstOrDefault()ใน Visual Studio จะเห็นได้ชัดว่าทำไม : วิธีการส่งกลับค่าstringไม่ใช่สิ่งที่เทียบเท่าได้ซึ่งstring?ฉันคาดหวัง การใช้วิธีการต่อไปนี้จะให้คำเตือนที่ฉันคาดไว้ var arg = args.Contains("abc") ? …

2
ทำไมเราถึงได้เป็นไปได้ dereference คำเตือนอ้างอิงโมฆะเมื่อการอ้างอิงโมฆะดูเหมือนจะเป็นไปไม่ได้?
เมื่ออ่านคำถามนี้ทาง HNQ ฉันได้อ่านเกี่ยวกับประเภทข้อมูลอ้างอิงที่น่าเบื่อใน C # 8และทำการทดลองบางอย่าง ฉันรู้ว่า 9 ครั้งใน 10 ครั้งหรือบ่อยกว่านั้นเมื่อมีคนพูดว่า "ฉันพบข้อผิดพลาดในการคอมไพเลอร์!" นี่คือการออกแบบและความเข้าใจผิดของพวกเขาเอง และตั้งแต่ฉันเริ่มมองหาคุณลักษณะนี้เฉพาะในวันนี้อย่างชัดเจนฉันไม่เข้าใจมันมากนัก ด้วยวิธีนี้ให้ดูที่รหัสนี้: #nullable enable class Program { static void Main() { var s = ""; var b = s == null; // If you comment this line out, the warning on the line below disappears var i …

3
ประเภทการอ้างอิงเป็นโมฆะใน C # 8 เมื่อใช้คลาส DTO กับ ORM
ฉันเปิดใช้งานคุณลักษณะนี้ในโครงการที่มีคลาส data data object (DTO) ตามที่ระบุด้านล่าง: public class Connection { public string ServiceUrl { get; set; } public string? UserName { get; set; } public string? Password { get; set; } //... others } แต่ฉันได้รับข้อผิดพลาด: CS8618: คุณสมบัติที่ไม่สามารถลบล้างได้ 'ServiceUrl' ไม่ได้ถูกกำหนดค่าเริ่มต้น พิจารณาประกาศคุณสมบัติเป็นโมฆะ นี่คือคลาส DTO ดังนั้นฉันไม่ได้เริ่มต้นคุณสมบัติ สิ่งนี้จะเป็นความรับผิดชอบของรหัสในการเริ่มต้นคลาสเพื่อให้แน่ใจว่าคุณสมบัติไม่เป็นโมฆะ ตัวอย่างเช่นผู้โทรสามารถทำได้: var connection = new Connection …

2
C # ไม่สามารถทำให้ `notnull 'ประเภทเป็นโมฆะ
ฉันพยายามสร้างประเภทที่คล้ายกับ Rust's Resultหรือ Haskell Eitherและฉันก็เข้าใจได้: public struct Result<TResult, TError> where TResult : notnull where TError : notnull { private readonly OneOf<TResult, TError> Value; public Result(TResult result) => Value = result; public Result(TError error) => Value = error; public static implicit operator Result<TResult, TError>(TResult result) => new Result<TResult, TError>(result); public static …
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.