如何将对象类型转换为短类型? (C#)

时间:2011-03-21 23:06:09

标签: c# casting

您好 C#编程新手。

我一直试图以这种方式投射:

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

编译器没有说什么,但在运行时我遇到了以下崩溃:

  

未处理System.InvalidCastException     消息=指定的关联无效。     来源= B11 Ex02     堆栈跟踪:          ב-B11_Ex02.Game..ctor(Object [] i_array)ב-.. \ B11 Ex02 \ Game.cs:第32行          ב-B11_Ex02.Program.Main()ב-\ B11 Ex02 \ Program.cs:第56行          ב-System.AppDomain._nExecuteAssembly(RuntimeAssembly assembly,String [] args)          ב-System.AppDomain.ExecuteAssembly(String assemblyFile,Evidence assemblySecurity,String [] args)          ב-Microsoft.VisualStudio.HostingProcess.HostProc.RunUsersAssembly()          ב-System.Threading.ThreadHelper.ThreadStart_Context(Object state)          ב-System.Threading.ExecutionContext.Run(ExecutionContext executionContext,ContextCallback callback,Object state,Boolean ignoreSyncCtx)          ב-System.Threading.ExecutionContext.Run(ExecutionContext executionContext,ContextCallback回调,对象状态)          ב-System.Threading.ThreadHelper.ThreadStart()     InnerException:

非常感谢您的帮助 提前致谢

4 个答案:

答案 0 :(得分:6)

错误消息告诉您i_array[i]返回的内容实际上无法转换为短消息。因此,我的建议是检查i_array以查看它在失败时在索引i中实际包含的内容。

编辑:Per Ben Voigts在我的评论中的见解:

  

这是拆箱,所以即使存储在i_array [i]的值可以转换为short,表达式(short)i_array [i]只有在i_array [i]完全是短的时候才会起作用(我认为运行时使得无符号短线与短线的例外,但不能进行扩大或缩小转换)。

我只在这里发帖,因为OP无法看到我删除的帖子。问题是您可能使用int's初始化集合中的元素,但是如果需要将它们取消打包,则需要显式地仅向集合添加短路( DO 您实际需要取消装箱?为什么不使用List<short>?)

答案 1 :(得分: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]);

答案 2 :(得分:0)

此异常告诉您无法将对象强制转换为简短。如果它不是短(可能是字符串或其他类型)类型需要定义一个强制转换操作符或你必须自己转换它。

没有编译器警告,因为在编译时无法判断对象是否可以转换为short类型。

答案 3 :(得分:0)

你正试图将某些东西缩短为无法施放的东西。作为一般规则,您希望使用其中一种Parse方法:

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");
}