2012-01-13 78 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