Вопрос по c# – C # приведение к обнуляемому типу?

28

Beyond обычная скучная разница междуCast а такжеAs

if i know that apple is a Fruit so I can use (Fruit)apple - and it throws an exception if it aint as value can be checked against null to see if succeeded [won't throw Exception...]

Однако я читал @EricLippertстатья об этом и был хороший пример о типах значений Nullable:

<code>short? s = (short?)123;
int? i = s as int?;
</code>

этотwon't компилировать ...

Cannot convert type 'short?' to 'int?' via a reference conversion, boxing conversion, unboxing conversion, wrapping conversion, or null type conversion

Fine.

так почему это:

<code>    short? s = (short?)123;
    int? i = (int?)s;
</code>

Does Компилировать? (Against ALL Expectations ! яKNOW тотs не являетсяint?  - и это должно пойти ЧЕЛОВЕК, но это не ...)

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

Я плохо себя чувствую, спрашивая об этом часто обсуждаемой теме.

Заранее спасибо.

Вы точно описали, что написал Эрик Липперт - актерский состав будет компилироваться, покаas Оператор не выиграет в случаях, связанных с обнуляемыми типами. Yahia
@Yahia, но согласны ли мы с тем, что шорт НЕ INT? Royi Namir
short это не int, НО можно привести / преобразовать в int - и это то, что вы говорите компилятору: сделайте это short целым. Yahia
Или, другими словами, в первом примереs as int?Вы пытаетесь конвертироватьs сам. Во втором примере(int?)sВы беретеvalue изs и попытаться преобразовать это. Имеет ли это смысл? Mr Lister
@RoyiNamir Попробуйте скомпилироватьint i = 123 as int; и ошибка будет «оператор as должен использоваться со ссылочным типом (« int »является типом значения)».int i = (int)123; с другой стороны, будет отлично компилироваться. Mr Lister

Ваш Ответ

4   ответа
25

as оператор пытается использовать объектs какint?, посколькуint? нигде в цепочке наследованияshort?, эта операция не выполняется.

Во втором примере вы фактически создаете новыйint? i со значением отshort? s, Это более щедрая операция, потому что она не должна сохранять оригиналs объект на левой стороне.

The important point here is that as isn't allowed to do anything that doesn't preserve your object's identity. An explicit cast can.

Вот что говорит C # стандарт о том, как(int?) Форма работы:

6.1.4 Implicit nullable conversions

Predefined implicit conversions that operate on non-nullable value types can also be used with nullable forms of those types. For each of the predefined implicit identity and numeric conversions that convert from a non-nullable value type S to a non-nullable value type T, the following implicit nullable conversions exist:

· An implicit conversion from S? to T?.

· An implicit conversion from S to T?.

Evaluation of an implicit nullable conversion based on an underlying conversion from S to T proceeds as follows:

· If the nullable conversion is from S? to T?:

o If the source value is null (HasValue property is false), the result is the null value of type T?.

o Otherwise, the conversion is evaluated as an unwrapping from S? to S, followed by the underlying conversion from S to T, followed by a wrapping (§4.1.10) from T to T?.

· If the nullable conversion is from S to T?, the conversion is evaluated as the underlying conversion from S to T followed by a wrapping from T to T?.

@sblom Я думаю, ты долженdouble-bold абзац выше говоряThe important point here is that as isn't allowed to do anything that doesn't preserve your object's identity. An explicit cast can. - Я думаю, что это является основой этого. А что касается кастинга, то я согласен, что мне это понятно (as не было на самом деле), и, как сказал Эрик, арифметики на коротких коротких позициях нет (это не имеет большого значения, но, по крайней мере, для меня это проще понять), она конвертируется в int.
@RoyiNamir, я действительно не понимаю. Преобразование существует изshort вint (это верно для C, Java и почти везде), а в спецификации C # описывается, как выполнить это преобразование и заставить его работать с обнуляемыми типами. (Я добавил соответствующую выдержку выше.)
за этим объяснением есть еще эта линия(int?)s что связано с эпохой наследования / бокса .... но это работает, и это то, что я не понимаю. Royi Namir
4

Пример:

int? i = (int?)s;

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

Вы получите исключение только во время выполнения, если приведение не будет успешным.

Нет исключения во время выполнения ..... Royi Namir
@RoyiNamir - Извините, следовало добавить, что только в том случае, если приведение не работает.
0

System.Nullable<int> (System.Nullable<T> это тип). Тип short определяет явное приведение к int, однакоSystem.Nullable<T> не имеет никакого такого явного приведения, потому что T может быть любым другим типом значения.

0

as в случае неудачи вам будет выдан «действительный»null результат, такfalse positive, Во втором случае приведение является допустимой причиной, в случае неудачи возникает исключение.

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