Приведение к System.Drawing.Color? - PullRequest
0 голосов
/ 13 января 2012

Когда я хочу привести объект к System.Drawing.Color (используя as), я получаю следующую ошибку во время компиляции:

The as operator must be used with a reference type or nullable type ('System.Drawing.Color' is a non-nullable value type)

Что я могу сделать?

Мой код похож на:

MyClass.indoorColor = parsedObject as System.Drawing.Color;

Ответы [ 6 ]

3 голосов
/ 13 января 2012

System.Drawing.Color является структурой и не может быть преобразован с помощью ключевого слова «as» из ссылочного типа в тип значения.

Попробуйте использовать один из методов 'From ..' из System.Drawing.Color, передав параметры:

http://msdn.microsoft.com/en-us/library/system.drawing.color_methods.aspx

0 голосов
/ 08 августа 2012
Private Function GetColorTxt(txtColor As String, DefaultSiBlanco As Drawing.Color) As Drawing.Color
    Dim colConvert As System.Drawing.ColorConverter = New System.Drawing.ColorConverter()
    Dim C As Drawing.Color
    Select Case txtColor
        Case "RED"
            C = Drawing.Color.Red
        Case "BLUE"
            C = Drawing.Color.Blue
        Case "CYAN"
            C = Drawing.Color.Cyan
        Case "WHITE"
            C = Drawing.Color.WhiteSmoke
        Case "MAGENTA"
            C = Drawing.Color.Magenta
        Case "BLACK"
            C = Drawing.Color.Black
        Case Is <> ""
            C = CType(colConvert.ConvertFromString(txtColor), System.Drawing.Color)
        Case Else
            C = DefaultSiBlanco
    End Select
    Return C
End Function
0 голосов
/ 13 января 2012

Существует два способа явного приведения объекта: либо

MyClass.indoorColor = (System.Drawing.Color)parsedObject;

, либо безопасный метод приведения через оператор as, который вы используете в этом вопросе.Прямое приведение вызовет InvalidCastException, если parsedObject не имеет правильный тип, где безопасный случай вернет ноль.Тем не менее, null не является допустимым значением для структуры и, следовательно, сообщение об ошибке, которое вы получаете.

Есть два способа обойти это, оба связаны с использованием обнуляемого типа.

Обнуляемый типобертка вокруг типа структуры, которая позволяет значению быть дополнительно нулевым и задается либо длинным форматом System.Nullable<System.Drawing.Color>, либо коротким форматом, который является просто?в конце типа System.Drawing.Color?

Так что либо измените определение типа indoorColor на System.Drawing.Color?, а затем выполните

MyClass.indoorColor = parsedObject as System.Drawing.Color?;

Или выберите значение по умолчанию, которое вы хотите использоватьв случае несовместимого типа (я собираюсь использовать прозрачный здесь) и использовать следующий синтаксис:

MyClass.indoorColor = parsedObject as System.Drawing.Color? ?? 
                                              System.Drawing.Color.Transparent;

The ??запись означает использование значения слева, если оно не равно null, в противном случае используйте значение справа;

0 голосов
/ 13 января 2012

Вы можете использовать:

System.Drawing.Color color = (System.Drawing.Color)parsedObject;
MyClass.indoorColor = color;

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

expression as type

Это эквивалентно следующему выражению, за исключением того, что выражение вычисляется только один раз:

expression is type ? (type)expression : (type)null

, т.е. оператор as не вызывает исключение, когдаон не может привести ваш parsedObject, но вместо этого должен заполнить переменную нулем.Но поскольку System.Drawing.Color является ненулевым типом (тип struct или value), его нельзя привести к нулевому значению (что можно сделать только со ссылочными типами) и, следовательно, к исключению.

0 голосов
/ 13 января 2012
Оператор

As может использоваться только с reference type. Для других объектов вы должны использовать прямое приведение.

0 голосов
/ 13 января 2012

Вы можете использовать as только для приведения с ссылочными типами.System.Drawing.Color является структурой, и вы должны привести ее следующим образом:

MyClass.indoorColor = (System.Drawing.Color)parsedObject;

Обновление:
Просто для уточнения: причина, по которой вы не можете использовать as для типов значений(а структуры являются типами значений), потому что as приведет к null, если переменная, которую вы пытаетесь привести, не совместима с выполняемым приведением.И поскольку тип значения не может быть null, это недопустимо.

Один вариант, как предлагается в vc 74, состоит в том, чтобы сделать indoorColor обнуляемым (Color?), или вы можете проверить, parsedObject имеет правильный тип перед попыткой произнесения.

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