gpt4 book ai didi

c# - 为什么编译器不能为我推断类型? (又名 Smarter SmartEnumerable)

转载 作者:行者123 更新时间:2023-11-30 19:01:00 26 4
gpt4 key购买 nike

我正在使用 Jon Skeet 的非常聪明的 SmartEnumerable .如果您还没有看过,我建议您检查一下。

定义类:

public class SmartEnumerable<T> : IEnumerable<SmartEnumerable<T>.Entry>

构造函数是:

public SmartEnumerable(IEnumerable<T> enumerable)

然后你通过说来使用它:

new SmartEnumerable<Cat>(myCats);  // where myCats is IEnumerable<Cat>

现在我真的很想让编译器推断出我有一个猫数组并且能够只说:

new SmartEnumerable(myCats);

但是这给了我一个编译器错误:

The type arguments for method 'MiscUtil.Collections.SmartEnumerable.SmartEnumerable(System.Collections.Generic.IEnumerable)' cannot be inferred from the usage. Try specifying the type arguments explicitly.

我不清楚这是为什么。有什么办法解决它。为什么它看不到我正在使用 IEnumerable<Cat>并由此推断。我可以更改任何内容以使其识别我正在使用的类型吗?

我真的很喜欢某种无需指定类型即可构造 SmartEnumerable 的方法 - 因为我主要将它用于 ASP.NET MVC 中的 UI,而我并不总是有 includes对于类型和依赖 var给我一个引用。我最终不得不包含类型,以便能够使用 SmartEnumerable - 这降低了它的优雅。

哦,我本来可以直接给 John 发电子邮件,但他可能会在这里回复得更快 :-)


<font color=white>skeet skeet skeet, jon, jon, jon, jon skeet, skeet jon, skeetster, skeetmeister</font>

最佳答案

试试这段代码

public static class SmartEnumerable {
public static SmartEnumerable<T> Create<T>(IEnumerable<T> source) {
return new SmartEnumerable<T>(source);
}
}

void Example() {
IEnumerable<string> myCats = GetMyCats();
var se = SmartEnumerable.Create(myCats);
}

您的代码失败是因为 C# 无法推断构造函数的泛型参数。但 C# 不仅能够推断其他方法的通用参数。

在 C# 中,拥有一个名称仅在通用参数上有所不同的类是完全合法的。例如 Foo 和 Foo (在幕后他们实际上是不同的名字)。所以上面的示例适用于大多数场景。每当我定义一个泛型类时,我个人都会使用它,在该泛型类中,构造函数采用足够的参数来推断完整类型。

关于c# - 为什么编译器不能为我推断类型? (又名 Smarter SmartEnumerable),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/544249/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com