我正在使用Jon Skeet非常聪明的SmartEnumerable.如果您还没有看过,我建议您查看一下.
该类定义如下:
public class SmartEnumerable: IEnumerable .Entry>
构造函数是:
public SmartEnumerable(IEnumerableenumerable)
你用它来说:
new SmartEnumerable(myCats); // where myCats is IEnumerable
现在我真的想让编译器推断我有一系列的猫,并且能够说:
new SmartEnumerable(myCats);
但是这给了我一个编译器错误:
无法从用法推断出方法'MiscUtil.Collections.SmartEnumerable.SmartEnumerable(System.Collections.Generic.IEnumerable)'的类型参数.尝试显式指定类型参数.
我不清楚为什么会这样.有没有办法绕过它.为什么它不能看到我正在使用IEnumerable
并从中推断出来.我可以改变任何东西,让它识别我正在使用的类型吗?
我真的想要一些方法来构建一个SmartEnumerable而不必指定类型 - 因为我主要在ASP.NET MVC中使用它来获取UI,我并不总是includes
对类型有所依赖并依赖于var
我的参考.我最终必须包含类型才能使用SmartEnumerable - 这会降低其优雅.
哦,我会直接通过电子邮件发送给John,但他反正可能会更快回复:-)
skeet skeet skeet, jon, jon, jon, jon skeet, skeet jon, skeetster, skeetmeister
试试这个代码
public static class SmartEnumerable { public static SmartEnumerableCreate (IEnumerable source) { return new SmartEnumerable (source); } } void Example() { IEnumerable myCats = GetMyCats(); var se = SmartEnumerable.Create(myCats); }
您的代码失败,因为C#无法在构造函数上推断泛型参数.但是C#能够推断其他方法的泛型参数.
在C#中,拥有一个只有通用参数才能区分名称的类是完全合法的.例如Foo和Foo
我同意JaredPar.我想指出你也可以做一个扩展方法:
public static SmartEnumerableAsSmart (this IEnumerable source) { return new SmartEnumerable (source); }
你会像这样使用它:
var smartEnumerable = myCats.AsSmart();
(这个例子听起来很有趣)
编辑:
Per Jon Skeet,我改名ToSmart
为AsSmart
.