C # Должен ли "как строка" работать так? - PullRequest
1 голос
/ 05 августа 2011

в виде строки вызвало у меня проблему при работе с массивами объектов.Значения после выполнения отображаются в комментариях.Должно ли это работать таким образом?

object[] array = new object[2]; 
array[0] = 0.33;
array[1] = "0.33";
string a = array[0] as string; // a == null !!!??????
string b = array[1] as string; // b == "0.33"
string a2 = array[0] == null ? "" : array[0].ToString(); // a2 == "0.33"
string a3 = Convert.ToString(array[0]); // a3 == "0.33"

Ответы [ 7 ]

10 голосов
/ 05 августа 2011

Да, должно.

as - оператор приведения.
Он может использоваться только для приведения объекта к типу, которым он на самом деле является (или к суперклассу).

x as Y возвращает null, если x не является Y.

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

оператор as возвращает ноль, если ему не удается привести объект к указанному типу. в этом случае ему не удалось привести 0.33 к типу string, поэтому строка a имеет значение null.

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

Оператор as является операцией приведения, а не операцией преобразования, поэтому он будет производить только значение того же типа, или супер- или подкласса или типа, который вы пытаетесь привести к.

(В отличие от обычного приведения оператор as также не выполняет пользовательских преобразований с использованием ключевого слова operator.)

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

MSDN :

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

Так что да, поведение, которое вы наблюдаете, правильное.

0 голосов
/ 05 августа 2011

array[0] является double и не может быть приведено к string, следовательно null.
Вызовите ToString(), большинство типов переопределяет его, чтобы вернуть что-то значимое.

0 голосов
/ 05 августа 2011

Оператор 'as' в основном подобен приведению в System.Type, однако единственное отличие состоит в том, что он возвращает нулевое значение, если приведение завершается неудачей, вместо выдачи исключения.

Проверьте эту ссылку для получения дополнительной информации http://msdn.microsoft.com/en-us/library/cscsdfbt(v=vs.71).aspx

0 голосов
/ 05 августа 2011

«as string» не является синонимом «ToString ()».Вы используете оператор «как» и случайно передали ему строку как тип.

Определение оператора as:

Замечания

Оператор as похож на приведение, за исключением того, что он возвращает ноль при ошибке преобразования вместо вызова исключения.Более формально, выражение в форме:

выражение в качестве типа эквивалентно:

выражение в типе?(тип) выражение: (тип) null

...