【问题标题】:The type '' cannot be used as type parameter 'T' in the generic type or method类型“”不能用作泛型类型或方法中的类型参数“T”
【发布时间】:2016-11-23 10:32:19
【问题描述】:

我已经创建了这个通用方法

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);

出现以下编译错误。

类型“Items”不能用作泛型中的类型参数“T” 类型或方法 “DB.GetByID(System.Collections.Generic.IEnumerable,int)”。那里 没有从“Items”到“IFields”的隐式引用转换

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

【问题讨论】:

  • Items 是否实现了IFields
  • @LasseV.Karlsen 实际上没有先生
  • 那你预计会发生什么?您特别说T 必须实现该接口,然后您尝试传入一个没有实现的类型。我可以发布一个简单的答案,告诉您为什么会收到该错误消息,但我怀疑这并不能真正帮助您。请告诉我们更多关于您添加约束的原因以及在传入未实现它的类型时为什么/预期会发生什么,也许我们可以帮助您在这里做正确的事情,而不仅仅是说“这就是为什么不会”没用”。
  • 我想您应该将其发布为答案先生。我是这方面的新手。问题解决了。谢谢

标签: c# generics lambda


【解决方案1】:

此错误消息的明显原因是Items 没有实现IFields

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

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

如果你没有这个,那么Items 不是你的GetByID&lt;T&gt; 方法的有效类型,因为它没有实现这个接口。

即使Items 类型恰好有正确的成员也是如此。除非您明确声明这些成员也通过执行我上面显示的操作来实现该接口,否则这还不够。因此,即使您的 Items 类型具有 id 属性,您仍然必须明确声明该类型实现了接口。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多