C# ToLookup方法是否返回Lookup类?
这个问题的答案似乎很简单。毕竟,如果您从C# ToLookup方法是否返回Lookup类?,c#,ienumerable,C#,Ienumerable,这个问题的答案似乎很简单。毕竟,如果您从IEnumerable接口检查ToLookup方法的文档,它会说它返回Lookup类,而Lookup类的文档,那么它会说创建它的唯一方法是通过ToLookup方法。但是,如果查看ToLookup方法的类型,您会很快注意到它不会返回Lookup类。相反,它返回ILookup接口的一个实例 所以我的问题是:它是否真的返回Lookup类?如果它确实返回了该类,那么即使文档中说它返回了该类,但它作为接口返回该类的原因是什么?写(Lookup)foo.ToLooku
IEnumerable
接口检查ToLookup
方法的文档,它会说它返回Lookup
类,而Lookup
类的文档,那么它会说创建它的唯一方法是通过ToLookup
方法。但是,如果查看ToLookup
方法的类型,您会很快注意到它不会返回Lookup
类。相反,它返回ILookup
接口的一个实例
所以我的问题是:它是否真的返回
Lookup
类?如果它确实返回了该类,那么即使文档中说它返回了该类,但它作为接口返回该类的原因是什么?写(Lookup)foo.ToLookup(bar)
安全吗?或者有人能写一个ToLookup
的实现,它实际上返回一个不同的类,而不是Lookup
,它也不能被转换成它吗?文档并不总是完美的,这里也是如此。实际上,它返回了ILookup
的一个实例,当前实现该接口的唯一可用类是Lookup
。因此,每当他们决定返回其他内容时,他们都会破坏文档,可能还会破坏现有代码,这些代码假定总是有一个查找
因此,如果您想安全起见,请使用var
或ILookup
声明类型
一般来说,最好返回一个接口,而不是一个具体的实现,因此您可以在不破坏任何代码的情况下自由更改实现。它返回一个
Lookup
类的实例,该类实现了ILookup
接口。您实际上提出了三个不同的问题,有三个不同的答案。你特别想回答哪一个问题?我应该在这个网站上把它分成3个不同的问题吗?主要是第一个,但其他的也有很大的关联。这不是不真实的。ILookup有两种实现,它们都称为查找。不明显的是System.Linq.Parallel.Lookup,它是内部的。Brr,任何名称中带有“parallel”的东西似乎都是一群牛仔写的。@因此,通过ToLookup()
返回的具体实例取决于实现。像这样检查源代码。为什么知道实现ILookup
接口的类实际上是否是System.Linq.Lookup
类很重要?“更好地返回实例”应该是“更好地返回接口”,对吗?@devNull:是的,当然,修复了它