Nullability ที่ไม่รู้จักใน C # 8 คืออะไร


12

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

คำตอบ:


12

ใช้วิธีการทั่วไปดังต่อไปนี้:

public static T Get<T>(T value)
{
    return value;
}

ถ้าเราเรียกมันว่าGet<string>(s)ผลตอบแทนไม่ใช่โมฆะและถ้าเราทำGet<string?>(s)มันก็เป็นโมฆะ

อย่างไรก็ตามหากคุณกำลังเรียกมันด้วยอาร์กิวเมนต์ทั่วไปเช่นGet<T>(x)และTไม่ได้รับการแก้ไขตัวอย่างเช่นมันเป็นอาร์กิวเมนต์ทั่วไปสำหรับคลาสทั่วไปของคุณเช่นด้านล่าง ...

class MyClass<T>
{
    void Method(T x)
    {
        var result = Get<T>(x);
        // is result nullable or non-nullable? It depends on T
    }
}

ที่นี่คอมไพเลอร์ไม่ทราบว่าในที่สุดมันจะถูกเรียกด้วยประเภทที่เป็นโมฆะหรือไม่เป็นโมฆะ

มีข้อ จำกัด ประเภทใหม่ที่เราสามารถใช้เป็นสัญญาณที่Tไม่สามารถเป็นโมฆะได้:

public static T Get<T>(T value) where T: notnull
{
    return value;
}

อย่างไรก็ตาม, ที่Tไม่มีข้อ จำกัด และยังคงเปิดอยู่, ความเป็นโมฆะไม่เป็นที่รู้จัก

หากไม่ทราบสิ่งเหล่านี้ถือว่าเป็นโมฆะคุณสามารถเขียนรหัสต่อไปนี้:

class MyClass<T>
{
    void Method(T x)
    {
        var result = Get<T>(x);
        // reassign result to null, cause we we could if unknown was treated as nullable
        result = null;
    }
}

ในกรณีที่Tไม่เป็นโมฆะเราควรได้รับคำเตือน ดังนั้นด้วยประเภท nullability ที่ไม่รู้จักเราต้องการคำเตือนเมื่อ dereferencing nullแต่ยังมีคำเตือนสำหรับการกำหนดที่อาจเกิดขึ้น


เมื่อฉันทำ var result = Test.Get <T> (x); result.ToString (); คอมไพเลอร์บ่นเกี่ยวกับการยกเลิกการอ้างอิงค่า Null ที่เป็นไปได้ ฉันไม่เห็นว่าไม่ทราบว่าแตกต่างจาก nullable เพียงแค่ในกรณีนี้
Stilgar

1
ในแง่ของคำเตือนพวกเขาประพฤติตนเหมือนกัน แต่มีความหมายต่างกัน คุณสามารถพูดได้ว่าความแตกต่างคือเชิงวิชาการและถ้านั่นคือประเด็นของคุณฉันก็เห็นด้วย
สจวร์ต

1
ฉันยังต้องการที่จะรู้ว่าทำไมความแตกต่างถูกนำมาใช้ มันแปลกที่จะแนะนำความแตกต่างดังกล่าวในภาษาเพื่อการศึกษา
Stilgar

ไม่ดีของฉันเพิ่งอ่านข้อมูลจำเพาะอัปเดตคำตอบส่วนสุดท้ายอธิบาย
สจวร์ต

1
อาที่มากขึ้นเช่นมัน
Stilgar
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.