ข้อมูลประเภทการอ้างอิงที่เป็นโมฆะไม่ถูกเปิดเผยจาก FirstOrDefault


10

ฉันต้องการทดสอบคุณลักษณะการอ้างอิงชนิด 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") ? "abc" : null;
return arg;

ไลบรารีระบบ (ในตัวอย่างนี้System.Linq) ไม่เปิดเผยข้อมูลความสามารถในการ null เมื่อกำหนดเป้าหมาย. NET Core 3.0 หรือไม่

คำตอบ:


9

ดูเหมือนว่าSystem.Linqจะไม่สามารถใส่คำอธิบายประกอบได้ในรุ่น 3.0 ดังนั้นประเภทการอ้างอิงที่เป็นโมฆะจึงไม่ปล่อยคำเตือนที่ถูกต้อง

คุณสามารถตรวจสอบปัญหาที่คล้ายกันได้ในรายการซ่อมของโรสลิปัญหาแบบเปิดของ Githubนี้คล้ายกับปัญหาของคุณมาก ในปัญหานั้นผู้ให้ข้อมูลอธิบายปัญหาปัจจุบัน:

System.Linqเป็น nullable ข้อเขียนในต้นแบบสาขาของ corefx แต่ไม่ได้อยู่ในการเปิดตัว / 3.0 ดังนั้นจึงไม่มีอะไรที่ไม่คาดคิดในคอมไพเลอร์ คอมไพเลอร์ควรให้การวินิจฉัยบางอย่างที่แสดงว่าคุณกำลังใช้สิ่งที่ไม่สามารถลบล้างได้


เพื่อเพิ่มสิ่งนี้คุณสามารถใช้แพ็คเกจนี้เพื่อรับบันทึกย่อที่ถูกต้องในวันนี้
canton7

1
ยังคงเป็นกรณีนี้ใน. NET Core 3.1 มันทำให้การทำงานกับประเภทอ้างอิง nullable น้อยลง ฉันเชื่อว่าคำขอดึงcorefx / pull / 40651แก้ไขสิ่งนี้ แต่เห็นได้ชัดว่าเราจะต้องรอจนกว่า. NET 5เพื่อให้ได้ :-(
Jeppe Stig Nielsen
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.