我有以下代码,我在.NET 4.0项目中编译
namespace ConsoleApplication1
{
class Program
{
static void Main(string[] args)
{
}
}
public static class Utility
{
public static IEnumerable<T> Filter1(this IEnumerable<T> input, Func<T, bool> predicate)
{
foreach (var item in input)
{
if (predicate(item))
{
yield return item;
}
}
}
}
}
但是会出现以下错误。我已将System.dll作为默认值包含在引用中。我可能做错了什么?
Error 1 The type or namespace name 'T' could not be found (are you missing a using directive or an assembly reference?)
Error 2 The type or namespace name 'T' could not be found (are you missing a using directive or an assembly reference?)
Error 3 The type or namespace name 'T' could not be found (are you missing a using directive or an assembly reference?)
答案 0 :(得分:51)
你必须将type参数放在函数本身上。
public static IEnumerable<T> Filter1<T>(...)
答案 1 :(得分:39)
public static class Utility
{
public static IEnumerable<T> Filter1<T>( // Type argument on the function
this IEnumerable<T> input, Func<T, bool> predicate)
{
如果你不关心它是否是一个扩展方法,你可以在类中添加一个通用约束。我的猜测是你想要扩展方法。
public static class Utility<T> // Type argument on class
{
public static IEnumerable<T> Filter1( // No longer an extension method
IEnumerable<T> input, Func<T, bool> predicate)
{
答案 2 :(得分:14)
您需要声明T
,它出现在方法名称或类名称之后。将您的方法声明更改为:
public static IEnumerable<T>
Filter1<T>(this IEnumerable<T> input, Func<T, bool> predicate)
答案 3 :(得分:2)
&LT; T>表示一种对象
IEnumerable<yourObject>
您可以在此处获取更多信息: http://msdn.microsoft.com/en-us/library/9eekhta0.aspx
答案 4 :(得分:0)
我有相同的错误,但所需的解决方案略有不同。我需要更改此内容:
public static void AllItemsSatisy(this CollectionAssert collectionAssert, ICollection<T> collection, Predicate<T> predicate)
{ ... }
对此:
public static void AllItemsSatisy<T>(this CollectionAssert collectionAssert, ICollection<T> collection, Predicate<T> predicate)
{ ... }