2011-03-21 116 views
1

嗨 C#編程新手。如何將對象類型轉換爲短類型? (C#)

我一直在試圖以這種方式投:

m_GameBoard = new Board((short)i_array[1]); // (i_array is defined as object[] i_array) 

編譯器不說什麼,但在運行時我遇到下列崩潰:

System.InvalidCastException未處理 消息=指定的關聯無效。 Source = B11 Ex02 StackTrace: ב-B11_Ex02.Game..ctor(Object [] i_array)ב-.. \ B11 Ex02 \ Game.cs:line 32 ב-B11_Ex02.Program.Main()ב-\ B11 Ex02 \ Program.cs:line 56 ב-System.AppDomain._nExecuteAssembly(RuntimeAssembly assembly,String [] args)System.AppDomain.ExecuteAssembly(String assemblyFile,Evidence assemblySecurity,String [] args) Microsoft- Microsoft .VisualStudio.HostingProcess.HostProc.RunUsersAssembly() ב-System.Threading.ThreadHelper.ThreadStart_Context(對象狀態) ב-System.Threading.ExecutionContext.Run(的ExecutionContext的ExecutionContext,ContextCallback回調,對象的狀態,布爾ignoreSyncCtx) ב- System.Threading.ExecutionContext.Ru N(執行上下文的ExecutionContext,ContextCallback回調,對象狀態) ב-System.Threading.ThreadHelper.ThreadStart() 的InnerException:

會非常感謝你的幫助 預先感謝

+1

你也可以說將數組的代碼? – eckleman 2011-03-21 23:11:29

+0

爲什麼你的異常包含'Game..ctor(Object [] i_array)'?這不是'Board'的構造函數。也許你的錯誤在別的地方? – Enigmativity 2011-03-21 23:22:55

回答

6

錯誤消息告訴你,無論是由i_array[i]返回的實際上都不能投射到短路。所以,我的建議是檢查i_array,看它在失敗時在索引i中實際包含的內容。

編輯:每本福格茨Insight在我的意見:

這是拆箱,所以即使存放在i_array值[I]可以被轉換爲短,表達式(短)i_array [I]只有在i_array [i]短小時纔有效(我認爲運行時會對未簽名的short和short進行異常處理,但不能擴大或縮小轉換範圍)。

我只在這裏發佈,因爲OP將無法看到我刪除的帖子。問題是你很可能使用int's來初始化集合中的元素,但是如果你需要取消它們,你只需要明確地向集合添加短褲(DO你實際上需要將它們取消裝箱?爲什麼不使用List<short>代替?)

+0

這是拆箱,所以即使存儲在'i_array [i]'的值可以轉換爲'short',表達式'(short)i_array [i]'只有在'i_array [i]'很短時纔有效(我認爲運行時對'unsigned short'和'short'做了一個例外,但是既不能擴大也不能縮小轉換範圍)。 – 2011-03-21 23:21:16

+0

@本Voigt:啊,很好的電話。這可能是問題;該數組很可能用ints初始化。您應該將其作爲答案發布!我正在刪除我的信息,以免因您的洞察力而感到失望。 – 2011-03-21 23:32:33

+0

@本Voigt:好的,我發佈了你的評論,以便OP會看到它。如果你發佈一個答案,我會刪除我的並給你+1 = D – 2011-03-21 23:35:37

0

此異常告訴你,你的物體不能被簡化。如果它不是短的(可能是一個字符串或其他類型) 該類型需要定義一個演員操作符來縮短或 您必須自己轉換它。

沒有編譯器警告,因爲在編譯時沒有辦法確定對象是否可被施放以輸入short。

+1

用戶定義的轉換不會在此上下文中調用。從'object'到任何值類型的轉換都是拆箱操作,並且類型必須完全匹配(我認爲更改簽名是一個例外,拆箱時仍然有效)。 – 2011-03-21 23:19:16

+0

謝謝,我編輯了我的帖子。 – Zebi 2011-03-22 07:56:18

0

你正試圖施展一些不能投射的東西。作爲一般規則,你要使用的解析方法之一:

m_GameBoard = new Board(short.Parse(i_array[1].ToString())); 

我建議你重構代碼一點,並使用short.TryParse(),所以在解析失敗,你可以處理的情況。

short i_short; 

if (short.TryParse(i_array[1].ToString(), i_short)) 
{ 
    m_GameBoard = new Board(i_short); 
} 
else 
{ 
    throw new ArgumentException("Some joker filled that array with something that wasn't an int16"); 
} 
1

這個工作對我來說:

Object Data_array (is filled with excel data): 
object[,] Data_array = (object[,])excelRange.get_Value(XlRangeValueDataType.xlRangeValueDefault); 

然後,轉換到短:

short data = (short)Convert.ToInt32(Data_array[x, y]); 
相關問題