Тип '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; }
      }
    }
}

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) неправильно.


Небольшое редактирование вашего ответа, чтобы подчеркнуть важность заглавной буквы. Я новичок в 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. 

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

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

Используя наш сайт, вы подтверждаете, что прочитали и поняли нашу Политику в отношении файлов cookie и Политику конфиденциальности.
Licensed under cc by-sa 3.0 with attribution required.