有人可以澄清一下 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# 在调试器和编译器中会引发转换/转换错误,但在运行时不会?