转换为System.Drawing.Color?

时间:2012-01-13 09:21:38

标签: c# casting

当我想将对象强制转换为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 个答案:

答案 0 :(得分:3)

System.Drawing.Color是一个Struct,不能使用'as'关键字从引用类型转换为值类型。

尝试通过传递参数来使用System.Drawing.Color中的'From ..'方法之一:

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

答案 1 :(得分:0)

您只能使用as来投射参考类型。 System.Drawing.Color是一个结构,你必须像这样抛出它:

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

更新
只是详细说明:你不能将as用于值类型(以及结构是值类型)的原因是因为as如果你想要转换的变量是null会导致null与你正在表演的演员兼容。由于值类型不能为indoorColor,因此不允许这样做。

根据vc 74的建议,一个选项是Color?可以为空(parsedObject),或者您可以在尝试投射之前检查{{1}}是否属于正确类型。< / p>

答案 2 :(得分:0)

As运算符只能与reference type一起使用。对于其他对象,您必须使用直接投射。

答案 3 :(得分:0)

您可以使用:

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

为什么会收到例外: as运算符就像一个强制转换操作。但是,如果无法进行转换,则返回null而不是引发异常。请考虑以下表达式:

expression as type

除了表达式只被计算一次之外,它等效于以下表达式:

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

即。 as运算符在它无法转换parsedObject时不会抛出异常,而是应该用null填充变量。但是,因为System.Drawing.Color是一个非可空(结构或值类型)类型,所以它不能被转换为空值(只能通过引用类型完成),因此也是例外。

答案 4 :(得分:0)

有两种方法可以直接显式地转换对象

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

或通过as运算符的安全转换方法,这是您在问题中使用的。如果parsedObject的类型不正确,则安全案例将返回null,直接强制转换将抛出InvalidCastException。但是,null不是结构的有效值,因此也是您获得的错误消息。

这有两种方法,都涉及使用可空类型。

可空类型是一个结构类型的包装器,它允许该值另外为空,并由长格式System.Nullable<System.Drawing.Color>或短格式指定?在类型System.Drawing.Color?

的末尾

因此,要么将indoorColor的类型定义更改为System.Drawing.Color?,然后再执行

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

或者选择在不兼容类型的情况下使用的默认值(我将在这里使用Transparent)并使用以下语法;

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

??符号表示使用左侧的值,除非它是null否则使用右侧的值;

答案 5 :(得分:0)

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