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

172

Почему я получаю сообщение об ошибке «Тип« строка »должен иметь тип значения, не допускающий значения NULL, чтобы использовать его в качестве параметра« 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; }
      }
    }
}
MiscellaneousUser
источник
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_Word = null, это ошибки, какие-либо предложения? Я хочу, чтобы Word мог быть пустым.
MiscellaneousUser
1
@MiscellaneousUser: какое сообщение об ошибке вы получаете? Можете ли вы опубликовать точный файл, который вы пытались скомпилировать? Трудно догадаться, в чем ваша ошибка, увидев только одну строку кода. Я имею в виду, что, возможно, вам не хватает точки с запятой ... но, может быть, вы просто забыли скопировать + вставить это ... Это не что иное, как догадки, пока вы не отправите код, который пытались скомпилировать.
Марк Байерс
Спасибо за помощь, увидел эту публикацию stackoverflow.com/questions/187406/… и вижу, что знак вопроса только для типов значений.
MiscellaneousUser
@MiscellaneousUser: это не просто «для типов значений». В частности, это должен быть тип значения, который не может быть равен нулю . Как говорится в сообщении об ошибке.
Марк Байерс
1
Хех, после программирования на некоторое время Swift, этот получил лучшее из меня в проекте на C #.
Альберт Бори
52

stringэто ссылочный тип, класс. Вы можете использовать Nullable<T>или T?синтаксический сахар C # только с необнуляемыми типами значений, такими как intиGuid .

В частности, как stringи ссылочный тип, выражение типа stringможет уже иметь значение null:

string lookMaNoText = null;
Джон Скит
источник
15

System.String (с заглавной буквы S) уже имеет значение null, вам не нужно объявлять его как таковой.

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

Chagbert
источник
Небольшое редактирование вашего ответа, чтобы подчеркнуть важность заглавной буквы. Я новичок в C #, и мне понадобилось навсегда, чтобы получить эту маленькую разницу.
B -
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 <... >>)? - Правка, которую я сейчас вижу, по-видимому, особенная. - Ошибка компиляции ... должна иметь тип, не допускающий значения NULL ....
Джошуа Энфилд
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. 

Здесь важно показать цель вашего кода. Если «намерение» состоит в том, что ссылочный тип может быть пустым, то пометьте его так, чтобы в противном случае присвоение пустому значению ненулевого значения привело к предупреждению компилятора.

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

ANewGuyInTown
источник