Для Enumerable.Empty <T>требуется явное приведение - PullRequest
0 голосов
/ 02 апреля 2020

Каждый пример, который я до сих пор читал (вопрос о Google / стеке), который объясняет использование «Enumerable.Empty», говорит, что я должен иметь возможность использовать его с массивом. Компилятор VS, однако, не позволит мне использовать его, если я не приведу его явно к массиву, несмотря на определение типа.

Почему это так? (Я не видел упоминаний о том, что актеры требуются в ~ 20 связанных стековых вопросах или общих результатах поиска в Google, на которые я смотрел)

//The internet says this should work, but i get a "Cannot implicitly convert type" error
public byte[] dataA = Enumerable.Empty<byte>();
public string[] dataB = Enumerable.Empty<string>(); 

//Throws no error, but the cast's requirement is never mentioned
public byte[] dataA = (byte[])Enumerable.Empty<byte>();
public string[] dataB = (string[])Enumerable.Empty<string>();

Ответы [ 3 ]

4 голосов
/ 02 апреля 2020

Enumerable.Empty генерирует пустую последовательность, а не массив.

Если вы хотите преобразовать последовательность в массив, вы можете вызвать ToArray:

byte[] dataA = Enumerable.Empty<byte>().ToArray();
string[] dataB = Enumerable.Empty<string>().ToArray(); 

Если вы действительно хотите пустой массив, тогда почему бы не сказать:

byte[] dataA = new byte[0];
string[] dataB = new string[0];

Ваше приведение может работать, но это во многом зависит от того, как реализован Empty. Он может просто возвращать пустой массив или может возвращать что-то еще, что реализует IEnumerable, но является пустым.

2 голосов
/ 02 апреля 2020
  1. Вы можете использовать метод ToArray() Linq, чтобы получить Array<T> из вашего IEnumerable<T>. Итак, как уже было сказано, вы могли бы создать пустую последовательность, используя Enumerable.Empty<T>, а затем преобразовать ее в массив.

  2. Обратите внимание, что в общем случае c Array<T>.Empty - это рекомендуемый способ для создания пустого массива, если он явно нужен.

  3. Избегайте этих приведений (byte[]), если возможно, они, вероятно, будут укусить тебя в будущем. На самом деле это совсем не обязательно.

2 голосов
/ 02 апреля 2020

Вы имели в виду Array.Empty<T>, не перечисляемый:

public byte[] dataA = Array.Empty<byte>();
public string[] dataB = Array.Empty<string>(); 
...