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


172

เหตุใดฉันจึงได้รับข้อผิดพลาด "ประเภท 'สตริง' ต้องเป็นประเภทค่าที่ไม่เป็นโมฆะเพื่อใช้เป็นพารามิเตอร์ 'T' ในประเภทหรือวิธีการทั่วไป 'System.Nullable'"

using System;
using System.Collections;
using System.Collections.Generic;
using System.Data;
using System.Diagnostics;
using Universe;

namespace Universe
{
    public class clsdictionary
    {
      private string? m_Word = "";
      private string? m_Meaning = "";

      string? Word { 
          get { return m_Word; }
          set { m_Word = value; }
      }

      string? Meaning { 
          get { return m_Meaning; }
          set { m_Meaning = value; }
      }
    }
}

21
Stringเป็นโมฆะแล้ว
M.Babcock

คำตอบ:


204

ใช้stringแทนstring?ในทุกสถานที่ในรหัสของคุณ

Nullable<T>ประเภทกำหนดว่า T เป็นชนิดค่าที่ไม่ใช่ nullable เช่นหรือint DateTimeประเภทการอ้างอิงเช่นstringนี้อาจเป็นค่าว่างได้ จะไม่มีประเด็นในการอนุญาตให้สิ่งต่าง ๆ เช่นNullable<string>ดังนั้นจึงไม่ได้รับอนุญาต

นอกจากนี้หากคุณใช้ C # 3.0 หรือใหม่กว่าคุณสามารถทำให้รหัสของคุณง่ายขึ้นโดยใช้คุณสมบัติที่ใช้งานอัตโนมัติ :

public class WordAndMeaning
{
    public string Word { get; set; }
    public string Meaning { get; set; }
}

1
M.Babcock เมื่อฉันทำ m_Word = null ข้อผิดพลาดข้อเสนอแนะใด ๆ ฉันต้องการให้ Word เป็นโมฆะ
เบ็ดเตล็ด

1
@ เบ็ดเตล็ดผู้ใช้: คุณได้รับข้อความแสดงข้อผิดพลาดอะไร คุณสามารถโพสต์ไฟล์ที่แน่นอนที่คุณพยายามรวบรวมได้หรือไม่ เป็นการยากที่จะคาดเดาความผิดพลาดของคุณจากการดูรหัสของคุณเพียงบรรทัดเดียว ฉันหมายความว่าอาจเป็นเพราะคุณไม่มีเซมิโคลอน ... แต่บางทีคุณลืมที่จะคัดลอก + วาง ... มันไม่มีอะไรนอกจากการคาดเดาจนกว่าคุณจะโพสต์รหัสที่คุณพยายามรวบรวม
Mark Byers

ขอบคุณสำหรับความช่วยเหลือเห็นการโพสต์stackoverflow.com/questions/187406/นี้และสามารถเห็นได้ว่าเครื่องหมายคำถามนั้นมีไว้สำหรับประเภทค่าเท่านั้น
เบ็ดเตล็ด

@ เบ็ดเตล็ดผู้ใช้: มันไม่ใช่แค่ "สำหรับประเภทค่า" ต้องเป็นชนิดค่าที่ไม่เป็นโมฆะโดยเฉพาะ เช่นเดียวกับข้อผิดพลาดที่บอกว่า
Mark Byers

1
Heh หลังจากเขียนโปรแกรม Swift ไปซักพักอันนี้ดีที่สุดของฉันในโครงการ C #
Albert Bori

52

stringเป็นประเภทอ้างอิงคลาส คุณสามารถใช้Nullable<T>หรือT?C # น้ำตาลประโยคที่ไม่ใช่ nullable ค่าประเภทเช่นและintGuid

โดยเฉพาะอย่างยิ่งเช่นเดียวstringกับประเภทอ้างอิงการแสดงออกของประเภทstringสามารถเป็นโมฆะ:

string lookMaNoText = null;

15

System.String (ด้วยตัวพิมพ์ใหญ่ S) นั้นเป็นโมฆะคุณไม่จำเป็นต้องประกาศเช่นนี้

(string? myStr) มันผิด.


แก้ไขคำตอบของคุณเล็กน้อยเพื่อเน้นความสำคัญของอักษรตัวใหญ่ ฉันยังใหม่กับ C # และใช้เวลาตลอดเลยที่จะได้รับความแตกต่างเล็กน้อยนี้
B - rian

4

ด้วยเหตุผลที่เฉพาะเจาะจงมากประเภทNullable<int>ให้วางเคอร์เซอร์ของคุณเป็น Nullable และกด F12 - เมทาดาทาจะให้เหตุผล (หมายเหตุข้อ จำกัด ของโครงสร้าง):

public struct Nullable<T> where T : struct
{
...
}

http://msdn.microsoft.com/en-us/library/d5x73970.aspx


4
หมายเหตุแม้ว่าNullable<Nullable<int>>จะไม่ได้รับอนุญาตแม้ว่าจะNullable<int>เป็นโครงสร้าง
Mark Byers

นั่นดูน่าสนใจ. นั่นคือ "ฮาร์ดโค้ด" ในคอมไพเลอร์หรือไม่? มัน จำกัด จากโครงสร้างเฉพาะอย่างไร (Nullable <Nullable <... >>)? - แก้ไขฉันเห็นตอนนี้เห็นได้ชัดว่ามันเป็นพิเศษ - ข้อผิดพลาดในการคอมไพล์ ... ต้องเป็นประเภทค่าที่ไม่เป็นโมฆะ ....
Joshua Enfield

4

โปรดทราบว่าในเวอร์ชั่น 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.