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