为什么 .Select 会将 Enumerable.Empty 更改为 System.Linq.EmptyPartition?

5

看这个例子:

IEnumerable<string> en = Enumerable.Empty<string>(); //{string[0]}
var enSelected = en.Select(id => id);                //{System.Linq.EmptyPartition<string>}
var list = en as IList<object>;                      //{string[0]}
var listSelected = enSelected as IList<object>;      //null

为什么在空的可枚举对象上使用.Select会改变其类型?这可能是LINQ中的一个错误吗?
System.Linq.EmptyPartition是什么?我没有找到关于这个类型的任何文档,也无法直接在代码中使用。
我正在使用Visual Studio 2017 15.4.2,在一个Xamarin.iOS项目中发生了这种情况。您能否在您的环境中测试一下,以便我们可以看到这是否特定于我的环境?

正如@Timbo所说,如果你需要将结果作为列表使用,应该使用ToList()而不是_as_运算符。 - Aleksei
1个回答

5

Select 声明的返回值是 IEnumerable<T>

返回对象的实际类型是实现的一部分,不应影响 API 用户。


1
好的,as IList<object> 转换实际上是 .Net ParseSDK 的一部分(将对象转换为Json)。 我添加了检查 as IEnumerable<object> 作为最后的手段(在检查字符串等之后),它有效了。所以,感谢您的回答,这可能不是LINQ的错误,但 System.Linq.EmptyPartition 类型仍然很奇怪,我从未听说过它。 - David Riha
除非它确实需要,否则不应该这样做。这是Core 3.0+中的一个重大变化,并且会产生副作用。 - Michael Brown
@MichaelBrown 不行。将引用跨越到它们没有按照契约实现的接口是错误的程序,无法保证其正常工作。 - Timbo
理想情况下你是正确的,但这会破坏JSON序列化等功能。 - Ola Berntsson

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接