Тип 'string' повинен бути ненульовим типом, щоб використовувати його як параметр T у загальному типі або методі 'System.Nullable <T>'


172

Чому я отримую помилку "Тип" string "повинен бути типом значення, що не зводиться до нуля, щоб використовувати його як параметр" 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вже зведена нанівець.
М.Бабкок

Відповіді:


204

Використовуйте stringзамість string?усіх місць вашого коду.

Nullable<T>Тип вимагає , що Т являє собою нульове значення , тип, наприклад , 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 як null.
Різне користувач

1
@MiscellaneousUser: Яке повідомлення про помилку ви отримуєте? Чи можете ви опублікувати точний файл, який ви намагалися скласти? Важко здогадатися, у чому твоя помилка, якщо бачити лише один рядок коду. Я маю на увазі, що може бути, що вам не вистачає напівколонки ... але, можливо, ви просто забули скопіювати + вставити ... Це не що інше, як здогадки, поки ви не опублікуєте код, який ви намагалися зібрати.
Марк Байєрс

Дякуємо за допомогу, побачив цю публікацію stackoverflow.com/questions/187406/… і бачимо, що знак питання призначений лише для типів значень.
Різне користувач

@MiscellaneousUser: Це не лише для типів значень. Спеціально воно повинно бути ненульовим типом значення. Так само, як говорить повідомлення про помилку.
Марк Байєрс

1
Хе, програмуючи Swift на деякий час, цей отримав найкраще з мене на проекті C #.
Альберт Борі

52

string- еталонний тип, клас. Можна використовувати Nullable<T>або T?синтаксичний цукор C # лише з типами значення, що не зводиться до нуля, такими як intі Guid.

Зокрема, як stringце посилальний тип, вираз типу stringвже може бути нульовим:

string lookMaNoText = null;

15

System.String (з капіталом S) вже є нульовим, вам не потрібно декларувати це як таке.

(string? myStr) неправильно.


Невелика редагування вашої відповіді, щоб підкреслити важливість великої літери. Я новачок у C #, і мені знадобилося назавжди отримати цю маленьку різницю.
B - rian

4

Для дуже конкретної причини Type 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>це структура.
Марк Байєрс

Це цікаво. Це "жорстке кодування" в компіляторі? Як це обмежено від конкретної структури (Nullable <Nullable <... >>)? - Редагувати. Я бачу зараз, мабуть, це особливе - помилка компіляції ... повинна бути типом значення, яке не зводиться до нуля ....
Джошуа Енфілд,

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. 

Тут важливим є показ наміру вашого коду. Якщо "намір" полягає в тому, що тип посилання може бути нульовим, то позначте його, щоб інакше присвоєння нульового значення ненульовому значенню призвело б до попередження компілятора.

Більше інформації

Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.