Pee*_*rvm 34 c# arrays unsigned casting
有人可以澄清一下C#is
关键字.特别是这两个问题:
Q1)第5行; 为什么这会回归真实?
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]);
}
}
}
Run Code Online (Sandbox Code Playgroud)
MSDN的描述并未澄清情况.它声明is
如果满足其中任何一个条件,它将返回true.(http://msdn.microsoft.com/en-us/library/scekt9xw(VS.71).aspx>MDSN文章)
expression is not null. expression can be cast to type.
我不相信你可以对int []进行有效的转换为uint [].因为:
A)此代码无法编译:
int[] signed = new int[] { -100 };
uint[] unsigned = (uint[])signed;
Run Code Online (Sandbox Code Playgroud)
B)在调试器中执行强制转换会产生错误:
(uint[])signed
"Cannot convert type 'int[]' to 'uint[]'"
Run Code Online (Sandbox Code Playgroud)
果然,如果第3行是int []而不是object,那么它永远不会编译.这让我想到了与Q2有关的最后一个问题.
Q3)为什么C#在调试器和编译器中引发了转换/转换错误,但在运行时没有?
Jon*_*eet 35
C#和CLR有一些不同的转换规则.
您无法在C#之间和之间直接转换,因为该语言不相信任何转换可用.但是,如果您通过结果取决于CLI.从CLI规范部分8.7开始(我希望 - 我刚才引用了Eric Lippert关于这个主题的电子邮件交换):int[]
uint[]
object
有符号和无符号整数基元类型可以相互分配; 例如,int8:= uint8有效.为此,bool应被视为兼容,
uint8
反之亦然,这是bool := uint8
有效的,反之亦然.对于相同大小的有符号和无符号整数基元类型的数组也是如此; 例如,int32[] := uint32[]
是有效的.
(我没有检查过,但我认为这种类型的引用类型转换是有效的,也是is
返回true的原因.)
有点不幸的是,语言与底层执行引擎之间存在脱节,但从长远来看,这是不可避免的,我怀疑.还有一些像这样的其他案例,但好消息是它们似乎很少造成重大伤害.
编辑:由于Marc删除了他的答案,我已经链接到Eric的完整邮件,发布到C#新闻组.
归档时间: |
|
查看次数: |
4334 次 |
最近记录: |