【发布时间】:2010-10-10 06:33:51
【问题描述】:
请有人澄清 C# is 关键字。特别是这两个问题:
Q1) 第 5 行;为什么返回 true?
Q2) 第 7 行;为什么没有强制转换异常?
public void Test()
{
object intArray = new int[] { -100, -200 };
if (intArray is uint[]) //why does this return true?
{
uint[] uintArray = (uint[])intArray; //why no class cast exception?
for (int x = 0; x < uintArray.Length; x++)
{
Console.Out.WriteLine(uintArray[x]);
}
}
}
MSDN 的描述没有说明情况。它声明is 将在满足其中任何一个条件时返回 true。 (http://msdn.microsoft.com/en-us/library/scekt9xw(VS.71).aspx>MDSN 文章)
我不相信您可以将 int[] 有效地转换为 uint[]。因为:
A) 此代码无法编译:
int[] signed = new int[] { -100 };
uint[] unsigned = (uint[])signed;
B) 在调试器中进行强制转换会出错:
(uint[])signed
"Cannot convert type 'int[]' to 'uint[]'"
果然,如果第 3 行是 int[] 而不是 object 那么它永远不会编译。这让我想到了与 Q2 相关的最后一个问题。
Q3) 为什么 C# 会在调试器和编译器中引发转换/转换错误,但在运行时不会?
【问题讨论】:
-
当你需要 Eric Lippert 时他在哪里?
-
错了,这是 Stack Overflow,你的意思是“当你需要 Jon Skeet 时他在哪里?” ;)
-
检查我的答案,我更新了一个视频链接,我认为该视频解释了潜在问题。看看吧!
标签: c# arrays casting unsigned