ข้อผิดพลาดสตริง C # nullable


136
private string? typeOfContract
{
  get { return (string?)ViewState["typeOfContract"]; }
  set { ViewState["typeOfContract"] = value; }
}

ต่อมาในรหัสฉันใช้มันเช่นนี้

typeOfContract = Request.QueryString["type"];

ฉันได้รับข้อผิดพลาดต่อไปนี้เมื่อประกาศการtypeOfContractระบุบรรทัด:

ประเภท 'สตริง' ต้องเป็นประเภทค่าที่ไม่เป็นโมฆะเพื่อใช้เป็นพารามิเตอร์ 'T' ในประเภทหรือวิธีการทั่วไป 'System.Nullable <T>'

ความคิดใด ๆ โดยทั่วไปฉันต้องการตรวจสอบให้แน่ใจว่า"type"มีอยู่ในQueryStringก่อนดำเนินการ

คำตอบ:


304

System.String เป็นประเภทการอ้างอิงและ "nullable" อยู่แล้ว

Nullable <T> และ? คำต่อท้ายใช้สำหรับประเภทค่าเช่น Int32, Double, DateTime เป็นต้น


13
สิ่งหนึ่งที่ควรทราบ: Nullable <T> เป็นประเภทค่าเอง แต่ข้อ จำกัด ประเภททั่วไป "struct" มีเฉพาะประเภทค่าที่ไม่เป็นโมฆะเท่านั้นดังนั้นคุณจึงไม่สามารถทำค่า Nullable <Nullable <int>> ได้
Jon Skeet

ใน C # 8.0 ประเภทการอ้างอิงอาจถูกทำเครื่องหมายเป็นโมฆะ หนึ่งอาจพิมพ์string?เพื่อบอกโลกสายนี้อาจเป็นโมฆะ Ref: youtube.com/watch?v=VdC0aoa7ung
nkalfov

39

คุณกำลังทำให้มันซับซ้อน stringเป็นโมฆะแล้ว คุณไม่จำเป็นต้องทำให้เป็นโมฆะมากขึ้น นำออกมา?ในประเภททรัพย์สิน


19

string ไม่สามารถเป็นพารามิเตอร์ให้เป็น Nullable ได้เนื่องจากสตริงไม่ใช่ประเภทค่า สตริงเป็นประเภทการอ้างอิง

string s = null; 

เป็นคำสั่งที่ถูกต้องมากและไม่จำเป็นต้องทำให้เป็นโมฆะ

private string typeOfContract
    {
      get { return ViewState["typeOfContract"] as string; }
      set { ViewState["typeOfContract"] = value; }
    }

ควรทำงานเนื่องจากคำหลักเป็น


13

สตริงเป็นประเภทอ้างอิงดังนั้นคุณไม่จำเป็นต้องใช้ (และไม่สามารถ) ใช้Nullable<T>ที่นี่ เพียงประกาศ typeOfContract เป็นสตริงและเพียงตรวจสอบ null หลังจากรับมาจากสตริงแบบสอบถาม หรือใช้ String.IsNullOrEmpty ถ้าคุณต้องการจัดการค่าสตริงว่างเหมือนกับ null


4

สำหรับ nullable ให้ใช้?กับprimitive C #ทั้งหมดยกเว้นสตริง

หน้าต่อไปนี้จะให้รายการของภาษาดั้งเดิมของC # : http://msdn.microsoft.com/en-us/library/aa711900(v=vs.71).aspx


1
ลิงก์ใช้งานไม่ได้ขอขอบคุณ
Mina Gabriel

ขอบคุณ Mina ฉันพบลิงค์อื่นและอัปเดตข้อมูลอ้างอิงแล้ว
James Oravec

1
ไม่ใช่แค่พื้นฐานเท่านั้นทุกชนิดของค่าที่ไม่เป็นโมฆะ (ซึ่งไม่ได้รับการจัดการโดย. NET) เป็นพิเศษ
IllidanS4 ต้องการโมนิก้ากลับ

0

โปรดทราบว่าในเวอร์ชั่น C # ที่กำลังจะมาถึงคือ 8 คำตอบนั้นไม่เป็นความจริง

All the reference types are non-nullable by default และคุณสามารถทำสิ่งต่อไปนี้ได้:

public string? MyNullableString; 
this.MyNullableString = null; //Valid

อย่างไรก็ตาม

public string MyNonNullableString; 
this.MyNonNullableString = null; //Not Valid and you'll receive compiler warning. 

สิ่งสำคัญที่นี่คือการแสดงเจตนาของรหัสของคุณ หาก "เจตนา" คือประเภทการอ้างอิงสามารถเป็นโมฆะได้ให้ทำเครื่องหมายไว้มิฉะนั้นการกำหนดค่า Null ให้ไม่เป็นโมฆะจะส่งผลให้เกิดคำเตือนคอมไพเลอร์

ข้อมูลเพิ่มเติม

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

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