2012-01-13 77 views
0

当我想对象转换的System.Drawing.Color(使用as),我在编译时出现以下错误:投射到System.Drawing.Color?

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; 
+1

parsedObject的类型是什么? – Saleh 2012-01-13 09:26:31

+0

你能描述一下你如何获得'parsedObject',它的类型是什么,你为什么期望它成功地转换成System.Drawing.Color? – GolfWolf 2012-01-13 09:27:24

回答

3

的的System.Drawing.Color是一个结构,并且可以不与从参考类型为值类型的“作为”关键字被铸造。

试图通过传递参数使用的一个 '从..' 从的System.Drawing.Color方法:

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

+0

+1,因为这是实际提供解决方案的唯一答案,而不仅仅是答案。 – 2012-01-13 09:45:09

+1

@MrLister ???我的回答提供了解决方案? – 2012-01-13 09:55:44

+0

@MrLister:这怎么可能是+1?还有很多其他的答案建议各种解决方案如何做到这一点。在这个答案中提到的'From ...'方法需要'String','int'或'KnownColor'的参数,所以除非'parsedObject'是这些类型中的任何一个,否则它们不会对你有太大的帮助。 – Nailuj 2012-01-13 10:10:18

0

只能使用as与引用类型铸造。 System.Drawing.Color是一个结构,你必须投它是这样的:

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

更新:
只是为了阐述:你不能用as值类型(和结构是值类型)的原因,是因为as将导致null如果你想投的变量是不是你执行转换兼容。而且,由于值类型不能null,这是不允许的。

的一个选项,由VC 74的建议,就是让indoorColor可空(Color?),或者您可以检查是否parsedObject是正确类型的尝试中投之前。

0

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

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一个不可为空(结构或值类型)类型的,它不能被铸造为空值(其可以仅参考类型来完成),因此该异常。

0

还有的通过为运营商,这是您使用的是什么的问题明确地投对象直接

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

或安全投法两种方式。如果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否则使用右侧的值;

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 
+0

你能否考虑解释这段代码,这样有人来更好地知道为什么它可能是对所提问题的回答? – 2012-09-28 02:03:28