Тип переменной заканчивается на? - PullRequest
11 голосов
/ 19 мая 2010

Что означает ?:

public bool? Verbose { get; set; }

При применении к string? возникает ошибка:

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

Ответы [ 7 ]

18 голосов
/ 19 мая 2010

? делает ваши необнуляемые (значения) типы обнуляемыми. Он не работает для string, так как он является ссылочным типом и поэтому по умолчанию может иметь значение null.

С MSDN , о типах значений:

В отличие от ссылочных типов, тип значения не может содержать нулевое значение. Тем не менее, обнуляемый тип действительно позволяет типам значений быть назначен на ноль.

? - это сокращение от Nullable<T> structure.

Если вы хотите узнать больше, у MSDN есть отличная статья по этой теме.

11 голосов
/ 19 мая 2010

? является сокращением для структуры ниже:

struct Nullable<T>
{
    public bool HasValue;
    public T Value;
}

Вы можете использовать эту структуру напрямую, но ? - это синтаксис быстрого доступа, чтобы сделать полученный код намного чище. Вместо того, чтобы печатать:

Nullable<int> x = new Nullable<int>(125);

Вместо этого вы можете написать:

int? x = 125;

Это не работает со строкой, поскольку строка является ссылочным типом, а не типом значения.

7 голосов
/ 19 мая 2010

bool? - это краткая форма для System.Nullable<bool>. Для параметра типа принимаются только типы значений, а не ссылочные типы (например, строка).

5 голосов
/ 19 мая 2010

bool? является сокращенной записью для Nullable<bool>. В общем, документация гласит:

Синтаксис T? это сокращение для Обнуляемый, где T - тип значения. Две формы взаимозаменяемы

Поскольку string не является типом значения (это ссылочный тип ), его нельзя использовать в качестве универсального параметра для Nullable<T>.

3 голосов
/ 19 мая 2010

? означает, что ваш тип значения может иметь нулевое значение, особенно в случае базы данных

для обработки вам нужны эти обнуляемые значения, чтобы проверить, является ли какое-либо значение нулевым или нет.

Может применяться только к типам значений, поскольку ссылочные типы могут быть нулевыми.

3 голосов
/ 19 мая 2010

Только типы значений могут быть объявлены как Nullable. Типы ссылок по умолчанию обнуляются. Таким образом, вы не можете создать пустую строку, так как строка является ссылочным типом.

3 голосов
/ 19 мая 2010

? Оператор указывает, что свойство на самом деле имеет тип NULL.

public bool? Verbose { get; set; } 

эквивалентно

public Nullable<bool> Verbose { get; set; }

Обнуляемый тип - это специальный тип, введенный в c # 2.0, который принимает тип значения как универсальный тип praramater и позволяет присваивать этому типу значения null.

Обнуляемый тип принимает только типы значений в качестве общих аргументов, поэтому вы получаете ошибку компиляции при попытке использовать? оператор в сочетании со строковым типом.

Для получения дополнительной информации: MSDN Nullable Types

...