Пожалуйста, добавьте название собственности, как это.
public class Model : Notifier, IDataErrorInfo
{
private string name;
public string Name
{
get { return name; }
set { name = value; OnPropertyChanged("Name"); }
}
}
Это вызвано тем, что ограничение структуры на самом деле означает 'не nullable', так как Nullable, несмотря на то, чтобы быть структурой, nullable (может принять пустой указатель значения), Nullable<int>
не допустимый параметр типа к внешнему Nullable.
Это сделано явным в ограничительной документации
где T: структура
Аргумент типа должен быть типом значения. Любой тип значения кроме Nullable может быть указан.
Посмотрите Используя Типы Nullable (Руководство по программированию C#) для получения дополнительной информации.
Если бы Вы хотите объяснение, для которого Вам были бы нужны фактические комментарии разработчика языка к нему, который я не могу найти. Однако я постулировал бы что:
Разрешение эквивалента интервала?? только перепутал бы это, так как язык не обеспечивает способа отличить 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>>
запрещаются.
Я полагаю, что можно только использовать не допускающее NULL-значения значение, вводит Nullable
s. С тех пор Nullable
самостоятельно nullable, вложен, этот путь запрещается.
Из http://msdn.microsoft.com/en-us/library/kwxxazwb.aspx
public Nullable( T value )
Тип: T тип значения.
Nullable является особенным, потому что существует явная поддержка упаковки и распаковывания типов Nullable, встроенных в CLR:
Если Вы используете MSIL box
инструкция против a Nullable<T>
, Вы на самом деле получите a null
как результат. Нет никакого другого типа значения, который произведет пустой указатель при упаковке.
Существует подобная и симметричная поддержка распаковывания.
Nullable позволяет Вам брать тип значения и делать его как ссылочный тип, в том смысле, что значение или существует или не (является пустым). Так как ссылочный тип уже nullable, он не позволяется.
Заключенный в кавычки из MSDN:
Nullable (T) поддержки структуры только с помощью значения вводят как nullable тип, потому что ссылочные типы nullable дизайном.
Универсальный параметр типа для Nullable должен самостоятельно быть не допускающим NULL-значения типом (т.е. типом значения). Это - предупреждение компилятора C#, которое я получаю, и это, казалось бы, имело бы смысл. Скажите мне, почему Вы хотели бы сделать такую вещь так или иначе? Я лично вижу быть бесполезное и мало значения к такому объявлению даже.