2011-03-21 111 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]); 
相关问题