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

Почему я получаю сообщение об ошибке "Тип" 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; }
      }
    }
}

Ответ 1

Используйте string вместо string? во всех местах вашего кода.

Тип Nullable<T> требует, чтобы T был недействительным типом значения, например int или DateTime. Такие ссылочные типы, как string, уже могут быть нулевыми. Не было бы смысла разрешать такие вещи, как Nullable<string>, поэтому он не разрешен.

Также, если вы используете С# 3.0 или более позднюю версию, вы можете упростить свой код, используя автоматически реализованные свойства:

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

Ответ 2

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

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

string lookMaNoText = null;

Ответ 3

System.String уже имеет значение NULL: вам не нужно объявлять ее как таковой (строка? myStr) неверна.

Ответ 4

По особой причине Type Nullable<int> наведите курсор на Nullable и нажмите F12. Метаданные приводят причину (обратите внимание на ограничение структуры):

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

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