Почему тип Nullable поддерживается CLR? - PullRequest
1 голос
/ 09 августа 2011

Я слышал, что добавление типа Nullable<T> в C # 2.0 должно немного пересмотреть CLR (время выполнения), нужно ли это изменение? Может ли он достичь той же цели, если будет добавлен только новый универсальный класс Nullable<T>?

Ответы [ 3 ]

2 голосов
/ 09 августа 2011

Nullable не является универсальным классом, как вы указываете, Nullable<T> является универсальным (у него есть параметр типа T). Вот почему Nullable<T> поступил только в C # 2.0: он появился с добавлением дженериков в CLR.

Вы можете сделать то же самое с обычным Nullable, но вы не можете делать такие вещи:

int? myInt = 123;
int result = myInt.Value;

Вместо этого вы должны:

int result = (int)myInt.Value;

... и это может быть небезопасно, я имею в виду, что если myInt.Value является string? Общая версия Nullable<T> допускает только int в свойстве Value.

Я не совсем понимаю, о чем вы спрашиваете ... "почему полезны универсальные классы"?

1 голос
/ 09 августа 2011

Если я вас правильно понимаю, вы спрашиваете, почему нельзя просто ввести Type в библиотеку фреймворка? но вместо этого нужно изменить CLR?

Хорошо, насколько я понимаю, Nullable - это особый тип, не совсем такой, как другие типы контейнеров. Во-первых, это на самом деле тип значения - определяемый как структура, а не класс. Отдельно он позволяет присваивать значение NULL (для типа значения, это особый случай), плюс он поддерживает использование «?» и оператор '??' что все новое. Nullable также становятся частью общей системы типов. Таким образом, я предполагаю, что с этой точки зрения спецификацию, компилятор и CLR нужно будет изменить.

0 голосов
/ 13 декабря 2011

Есть только две причины, по которым я знаю, для специальной обработки Nullable :

  1. Чтобы разрешить типовое преобразование из нулевого объекта со ссылкой на Nullable с HasValue = false.
  2. Чтобы разрешить Nullable , где HasValue равно false, сравнивать равным нулю.

Честно говоря, думаю, что было бы лучше разрешить Nullable помечать, как любой другой тип значения, и определить Nullable .Empty как значение, с которым можно сравнивать (для тех случаев, когда можнохотите сравнить с переменной, которая может быть нулевой или может содержать значение).На мой взгляд, нет причин, по которым Object.Equals должен сообщать, что «int?»который равен нулю равен "долго?"который также равен нулю.Первое должно рассматриваться как пустое поле целого размера, а второе - как пустое длинное поле.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...