Возможный дубликат:
Что это за новая [] сокращенная версия для?
Есть ли разница между
var strings = new string[] { "hello", "world" };
и
var strings2 = new[] { "hello", "world" };
Возможный дубликат:
Что это за новая [] сокращенная версия для?
Есть ли разница между
var strings = new string[] { "hello", "world" };
и
var strings2 = new[] { "hello", "world" };
В этом случае никакая разница, поскольку new[]
будет вывести тип предоставленных значений как string
.
Никакой разницы.
Второй - синтаксический сахар, называемый "Неявно типизированные массивы" , и оба выражения возвращают массив строк.
Если вы не укажете тип массива, он выводится из типов элементов, используемых для инициализации массива.
Чтобы разрешить вывод, выражение должно удовлетворять следующему условию:
Учитывая неявное типизированное выражение массива, подобное этому:
var arr = new []{ obj1, ... , objn }
и набор всех типов элементов в инициализации:
S = {T1, ..., Tn}
чтобы разрешить вывод (т.е. ошибка компилятора), должно быть возможно, чтобы все типы { T1, ... , Tn }
были неявно приведены к одному из типов в наборе S
.
Так, например, заданы следующие классы:
class Base { }
class Derived1 : Base { }
class Derived2 : Base { }
class Derived3
{
public static implicit operator Base(Derived3 m)
{ return null; }
}
Этот код компилируется:
var arr = new []{ new Derived1(), new Derived2(), new Derived3(), new Base()};
а следующее:
var arr = new []{ new Derived1(), new Derived2(), new Derived3() };
так как в первом случае все 3 типа могут быть неявно приведены к типу Base
, а тип Base
находится внутри набора S = { Derived1, Derived2, Derived3, Base }
, тогда как во втором случае все типы не могут быть перенесены на один тип в набор S = { Derived1, Derived2, Derived3 }
Эта функция была введена с С# 3.0 вместе с анонимными типами и упрощает создание массивов последних.
Например, это было бы очень трудно получить без неявно типизированных массивов:
var arrayOfAnonymous = new[] { new { A = 3, B = 4 }, new { A = 2, B = 5 } };
В этом случае нет разницы. Из-за hello
и world
находятся string
;
var strings2 = new[] { "hello", "world" };
создает массив string[]
, который совпадает с первым.
Второй называется просто Implicitly Typed Arrays
Если мы сделаем еще один шаг, у них будет тот же код IL
.
Нет, компилятор интерпретирует его как new string[] { "hello", "world" };
Как и при использовании var
, компилятор обрабатывает то, что вы имели в виду.
new [] создает неявно типизированный массив, в котором тип выводится из элементов. в то время как другой подход создает массив строк.
Нет никакой разницы. Во втором случае компилятор С# достаточно умен, чтобы вывести тип массива, поскольку он видит, что значения, используемые для инициализации массива, имеют строку типа.