Każdy przykład, który przeczytałem do tej pory (wynik Google / pytanie stosu), który wyjaśnia użycie „Enumerable.Empty”, mówi, że powinienem móc używać go z tablicą. Jednak kompilator VS nie pozwala mi go używać, chyba że jawnie rzutuję go na tablicę pomimo zdefiniowania typu.

Dlaczego to? (Nie widziałem żadnego odniesienia do rzutowania wymaganego w ~ 20 powiązanych pytaniach dotyczących stosu lub ogólnych wynikach Google, które oglądałem)

//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>();
-2
Reahreic 2 kwiecień 2020, 16:40

3 odpowiedzi

Najlepsza odpowiedź

Miałeś na myśli Array.Empty<T>, not Enumerable:

public byte[] dataA = Array.Empty<byte>();
public string[] dataB = Array.Empty<string>(); 
2
Rup 2 kwiecień 2020, 13:49
  1. Możesz użyć metody ToArray() Linq, aby uzyskać Array<T> ze swojego IEnumerable<T>. Tak więc, jak już powiedziano, można utworzyć pustą sekwencję za pomocą Enumerable.Empty<T>, a następnie przekonwertować ją na tablicę.

  2. Zauważ, że generalnie statyczny Array<T>.Empty to zalecany sposób tworzenia pustej tablicy, jeśli wyraźnie jej potrzebujesz.

  3. Unikaj tych rzutów (byte[]), jeśli możesz, prawdopodobnie będą cię mocno ugryźć w przyszłości. W istocie wcale nie jest to wymagane.

2
Pac0 2 kwiecień 2020, 13:55

Enumerable.Empty generuje pustą sekwencję, a nie tablicę.

Jeśli chcesz przekonwertować sekwencję na tablicę, możesz wywołać ToArray:

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

Jeśli naprawdę chcesz mieć pustą tablicę, dlaczego nie powiedzieć:

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

Twoje przesyłanie może działać, ale w dużym stopniu zależy to od sposobu zaimplementowania Empty. Może po prostu zwrócić pustą tablicę lub może zwrócić coś innego, co implementuje IEnumerable, ale jest puste.

4
Sean 3 kwiecień 2020, 08:21