Enumerable.Empty<T> 需要显式转换

Explicit cast required for Enumerable.Empty<T>

到目前为止我读过的每个示例(google result/stack 问题)解释了 "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>();

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 的实施方式。它可能只是 return 一个空数组,或者它可能 return 实现了 IEnumerable 但为空的其他东西。

你的意思是 Array.Empty<T>,不是可枚举的:

public byte[] dataA = Array.Empty<byte>();
public string[] dataB = Array.Empty<string>(); 
  1. 您可以使用 ToArray() Linq 方法从 IEnumerable<T> 中获取 Array<T>。因此,如前所述,您 可以 使用 Enumerable.Empty<T> 创建一个空序列,然后将其转换为数组。

  2. 请注意,如果您明确需要一个空数组,通常静态 Array<T>.Emptyrecommended way 来创建一个空数组。

  3. 如果可以,请避免这些强制转换 (byte[]),它们将来可能会咬你一口。实际上根本不需要。