我偶然发现了一个我不理解的行为(在C#,.NET Core 2.0中)。
我有一个int[]
并且会增加其中的值,就像人们期望的那样。它按预期工作。请注意,这只是示例代码。
int[] intArr = new int[10];
for (int i = 0; i < intArr.Length; i++)
{
intArr[i] = intArr[i] + 1;
}
然后我想我会优化它。由于我只需要0到9之间的值,我以为我会使用short[]
或更好的byte[]
(以节省几个字节)。但我得到的是需要对每个增量进行强制转换(它会增加很多)。
我决定坚持使用int[]
代替short[]
或byte[]
,但我仍感到困惑。
如果没有演员阵容,为什么不可能?这背后是否有任何逻辑(无法在不增加额外成本的情况下优化几个字节)?
示例我的意思+ VS 2017中显示的消息
short oneShort = 1;
short[] shortArr = new short[10];
for (int i = 0; i < shortArr.Length; i++)
{
//Cannot implicitly convert type 'int' to 'short'. An explicit conversion exists (are you missing a cast?)
//shortArr[i] = shortArr[i] + 1;
//Cannot implicitly convert type 'int' to 'short'. An explicit conversion exists (are you missing a cast?)
//shortArr[i] = shortArr[i] + oneShort;
//Cast is redundant.
//Cannot implicitly convert type 'int' to 'short'. An explicit conversion exists (are you missing a cast?)
//shortArr[i] = shortArr[i] + (short)1;
//Cast is redundant.
//Cannot implicitly convert type 'int' to 'short'. An explicit conversion exists (are you missing a cast?)
//shortArr[i] = (short)shortArr[i] + (short)1;
// why? no overloaded operators???
shortArr[i] = (short)(shortArr[i] + 1);
}
byte[] byteArr = new byte[10];
for (int i = 0; i < byteArr.Length; i++)
{
// the same with bytes
byteArr[i] = (byte)(byteArr[i] + 1);
}