2010-05-19 2 views
11

Что ? значит:Переменный тип, заканчивающийся на?

public bool? Verbose { get; set; } 

При нанесении на string?, есть ошибка:

The type 'string' must be a non-nullable value type in order to use it as parameter 'T' in the generic type or method 'System.Nullable'

+3

Просто добавьте другие ответы, описывающие типы с нулевым значением. Bool хранится в памяти как 0 или 1, другой опции нет. При создании этого типа с нулевым значением выделяет большую область памяти, где ее значение может быть истинным, ложным или нулевым. Вы заметите, что теперь вы можете делать такие вещи, как Verbose.HasValue, которые вы не могли бы сделать, если бы это было определено как bool. –

+0

Также, чтобы добавить общий диалог, все ссылочные типы по умолчанию имеют значение NULL (I.E. вы можете установить их все в null), поэтому тип Nullable предназначен для их не принимать, поскольку он дублирует функциональность и усложняет вопросы. – Rangoric

+1

Возможный дубликат [Что такое «DateTime?» в C#?] (http://stackoverflow.com/questions/109859/what-does-datetime-mean-in-c) –

ответ

18

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

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

Unlike reference types, a value type cannot contain the null value. However, the nullable types feature does allow for values types to be assigned to null.

? в основном сокращением для Nullable<T> structure.

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

7

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

5

bool? является сокращенным обозначением для Nullable<bool>. В общем, the documentation гласит:

The syntax T? is shorthand for Nullable, where T is a value type. The two forms are interchangeable

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

11

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

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

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

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

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

int? x = 125; 

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

3

The? оператор указывает, что свойство фактически является нулевым типом.

public bool? Verbose { get; set; } 

является equilvalent к

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

обнуляемого типа представляет собой особый тип введен в C# 2.0, который принимает тип значения в качестве универсального типа praramater и позволить, чтобы нули быть отнесены к типу.

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

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

3

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

3

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

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

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

Смежные вопросы