您好 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:
非常感谢您的帮助 提前致谢
答案 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");
}