繁体   English   中英

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

[英]Explicit cast required for Enumerable.Empty<T>

到目前为止,我读过的每个示例(谷歌结果/堆栈问题)都解释了“Enumerable.Empty”的使用,说明我应该能够将它与数组一起使用。 然而,VS 编译器不允许我使用它,除非我明确地将它转换为数组,尽管定义了类型。

为什么是这样? (我在大约 20 个相关的堆栈问题或我看过的一般谷歌结果中没有看到需要演员表的参考)

//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的实现方式。 它可能只返回一个空数组,或者它可能返回实现IEnumerable但为空的其他内容。

你的意思是Array.Empty<T> ,而不是 Enumerable:

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

  2. 请注意,通常静态Array<T>.Empty是创建空数组的推荐方法,如果您明确需要的话。

  3. 如果可以,请避免使用那些类型转换(byte[]) ,它们将来可能会咬你一口。 事实上,它根本不是必需的。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM