2016-11-23 132 views
0

我已经创建这个通用方法类型“”不能被用作类型参数“在通用类型或方法T”

public IEnumerable<T> GetByID<T>(IEnumerable<T> source, int id) where T : IFields 
{ 
    return source.Where(x => x.id == id); 
} 

其中IFieds接口是

public interface IFields 
{ 
    string code { get; set; } 
    int id { get; set; } 
} 

当我尝试得到的值,这显然不会编译

DB.GetByID(Helper.Database.Table<Items>(), 1); 

与以下编译错误。

类型“项目”不能在通用 类型或方法 “DB.GetByID(System.Collections.Generic.IEnumerable,INT)”被用作类型参数“T”。有 是没有从“项目”到“IFields”的隐含参考转换

我该如何解决这个问题? 其实,我希望使用lambda表达式“以匿名类型”。

+3

'Items'是否实现'IFields'? –

+0

@ LasseV.Karlsen其实没有先生 – OrElse

+2

那么你预计会发生什么?你特别说'T'必须实现那个接口,然后你尝试传入一个没有的类型。我可以发布一个简单的答案,告诉你为什么你会得到这个错误消息,但我怀疑这不会帮你。请告诉我们更多关于你为什么添加了约束的问题,以及为什么/当你传入一个没有实现它的类型时会发生什么,或许我们可以帮助你做正确的事情,而不仅仅是说“这就是为什么赢了”工作“。 –

回答

3

此错误消息的明显原因是Items未执行IFields

换句话说,你Items类型需要有这样的:

public class Items : IFields 
        ^-----^ 

如果没有这个,那么Items不是有效的类型,请GetByID<T>方法,因为它没有实现这个接口。

即使Items类型碰巧拥有正确的成员,情况也是如此。除非你明确指出那些成员也实现了接口,通过做我上面所展示的,那是不够的。因此,即使您的Items类型具有id属性,您仍然必须明确声明该类型实现了该接口。

相关问题