Массив в С# неявно ссылается на ссылочный тип:
object[] listString = new string[] { "string1", "string2" };
Но не по типу значения, поэтому, если вы измените string
на int
, вы получите скомпилированную ошибку:
object[] listInt = new int[] {0, 1}; // compile error
Теперь проблема заключается в том, что вы объявляете массив int
, как два синтаксиса, ниже которых явно не объявляется тип int
, просто дифференцируйте только на new[]
, компилятор будет обрабатывать по-разному:
object[] list1 = { 0, 1 }; //compile successfully
object[] list2 = new[] {0, 1}; //compile error
Вы получите object[] list1 = { 0, 1 };
скомпилировано успешно, но object[] list2= new[] {0, 1};
скомпилированная ошибка.
Кажется, компилятор С# рассматривает
object[] list1 = { 0, 1 };
а
object[] list1 = new object[]{ 0, 1 };
но
object[] list2 = new[] { 0, 1 };
а
object[] list2 = new int[]{ 0, 1 }; //error because of co-variant
Почему компилятор С# ведет себя по-другому в этом случае?