Почему пытается использовать строку? (Nullable string) в С# выдает синтаксическую ошибку?

У меня есть метод, который возвращает null, если почтовый индекс недействителен, и просто возвращает string, если он действителен. Он также преобразует данные в определенных случаях.

У меня есть следующий unit test ниже, но я получаю синтаксические ошибки в строках, где он использует string?. Может ли кто-нибудь сказать мне, почему?

    public void IsValidUkPostcodeTest_ValidPostcode()
    {
        MockSyntaxValidator target = new MockSyntaxValidator("", 0);
        string fieldValue = "BB1 1BB";
        string fieldName = "";
        int lineNumber = 0;
        string? expected = "BB1 1BB"; 
        string? actual;

        actual = target.IsValidUkPostcode(fieldValue, fieldName, lineNumber);

        Assert.AreEqual(expected, actual);
    }

Ответ 1

Суффикс ? для имени типа является псевдонимом для использования Nullable<T> (раздел 4.1.10 С# 4 спецификации). Параметр type для Nullable<T> имеет ограничение struct:

public struct Nullable<T> where T : struct

Это ограничивает T недействительным типом значения. Это запрещает использование string, поскольку System.String является ссылочным типом.

К счастью, поскольку строка является ссылочным типом, вам не нужно использовать Nullable<T> - она ​​уже имеет нулевое значение (нулевая ссылка):

string x = null; // No problems here

Ответ 2

string уже является нулевым типом, а не требуется ?