Nullable <T> беспорядок

Пожалуйста, добавьте название собственности, как это.

public class Model : Notifier, IDataErrorInfo
{
    private string name;

    public string Name
    {
        get { return name; }
        set { name = value; OnPropertyChanged("Name"); }
    }
}
10
задан Josh Lee 6 July 2010 в 18:04
поделиться

5 ответов

Это вызвано тем, что ограничение структуры на самом деле означает 'не nullable', так как Nullable, несмотря на то, чтобы быть структурой, nullable (может принять пустой указатель значения), Nullable<int> не допустимый параметр типа к внешнему Nullable.

Это сделано явным в ограничительной документации

где T: структура
Аргумент типа должен быть типом значения. Любой тип значения кроме Nullable может быть указан.
Посмотрите Используя Типы Nullable (Руководство по программированию C#) для получения дополнительной информации.

Если бы Вы хотите объяснение, для которого Вам были бы нужны фактические комментарии разработчика языка к нему, который я не могу найти. Однако я постулировал бы что:

  1. компилятор и изменения платформы, требуемые достигнуть Nullable в, он - текущая форма, довольно обширны (и было относительно последнее дополнение к этим 2,0 выпускам).
  2. У них есть несколько потенциально запутывающих пограничных случаев.

Разрешение эквивалента интервала?? только перепутал бы это, так как язык не обеспечивает способа отличить Nullable<Nullable<null>> и Nullable<null> ни любое очевидное решение следующего.

Nullable<Nullable<int>> x = null;
Nullable<int> y = null;
Console.WriteLine(x == null); // true
Console.WriteLine(y == null); // true
Console.WriteLine(x == y); // false or a compile time error!

Создание, которые возвращают true, было бы очень сложными и значительными издержками на многих операциях, включающих тип Nullable.

Некоторые типы в CLR являются 'особенными', примерами являются строки и примитивы в этом, компилятор и время выполнения знают много о реализации, используемой друг другом. Nullable является особенным таким образом также. Так как это уже особенное в корпусе в других областях специальное преобразование регистра where T : struct аспектом не является такое грандиозное предприятие. Преимущество этого имея дело со структурами в универсальных классах, потому что ни один из них, кроме Nullable, не может быть сравнен с пустым указателем. Это означает, что монета в пять центов может безопасно рассмотреть t == null быть ложью всегда.

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

int? x = null;
int? y = null;
Console.WriteLine(x == y); // true
Console.WriteLine(x >= y); // false!     

Путем предотвращения Nullables при использовании структуры универсальное ограничение многие противные (и неясный) можно избежать пограничных случаев.

Относительно точной части спецификации, которая передает под мандат это от раздела 25.7 (шахта акцента):

Ограничение типа значения указывает, что аргумент типа, используемый для параметра типа, должен быть типом значения (§25.7.1). Любой не допускающий NULL-значения тип структуры, перечислимый тип или параметр типа, имеющий ограничение типа значения, удовлетворяют это ограничение. Параметр типа, имеющий ограничение типа значения, не должен также иметь ограничения конструктора. Система. Тип Nullable указывает не допускающее NULL-значения ограничение типа значения для T. Таким образом, рекурсивно созданные типы форм T?? и Nullable<Nullable<T>> запрещаются.

19
ответ дан 3 December 2019 в 14:00
поделиться

Я полагаю, что можно только использовать не допускающее NULL-значения значение, вводит Nullables. С тех пор Nullable самостоятельно nullable, вложен, этот путь запрещается.

Из http://msdn.microsoft.com/en-us/library/kwxxazwb.aspx

public Nullable(
    T value
)

Тип: T тип значения.

14
ответ дан 3 December 2019 в 14:00
поделиться

Nullable является особенным, потому что существует явная поддержка упаковки и распаковывания типов Nullable, встроенных в CLR:

Если Вы используете MSIL box инструкция против a Nullable<T>, Вы на самом деле получите a null как результат. Нет никакого другого типа значения, который произведет пустой указатель при упаковке.

Существует подобная и симметричная поддержка распаковывания.

3
ответ дан 3 December 2019 в 14:00
поделиться

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

Заключенный в кавычки из MSDN:

Nullable (T) поддержки структуры только с помощью значения вводят как nullable тип, потому что ссылочные типы nullable дизайном.

0
ответ дан 3 December 2019 в 14:00
поделиться

Универсальный параметр типа для Nullable должен самостоятельно быть не допускающим NULL-значения типом (т.е. типом значения). Это - предупреждение компилятора C#, которое я получаю, и это, казалось бы, имело бы смысл. Скажите мне, почему Вы хотели бы сделать такую вещь так или иначе? Я лично вижу быть бесполезное и мало значения к такому объявлению даже.

2
ответ дан 3 December 2019 в 14:00
поделиться
Другие вопросы по тегам:

Похожие вопросы: