为什么在索引处递增数组(short,byte)时需要强制转换

时间:2017-11-03 09:41:27

标签: c# .net-core

我偶然发现了一个我不理解的行为(在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);
}

0 个答案:

没有答案