【问题标题】:C#: Generic interfaces and understanding "type parameter declaration must be an identifier not a type"C#:通用接口和理解“类型参数声明必须是标识符而不是类型”
【发布时间】:2009-11-25 16:22:48
【问题描述】:

我正在尝试理解this中描述的通用接口

我的例子有一个接口:

  public interface ITest<T> where T: class
  {
    T GetByID(int id);
  }

我有一个实现接口的类,使用LINQ到项目Data中的实体,其中包含类myClass:

  public class Test<myClass> :  ITest<myClass> where myClass : class
  {
      Data.myEntities _db = new Data.myEntities();

      public myClass GetByID(int id)
      {
        var item = _db.myClass.First(m => m.ID == id);
        return item;
      }

  }

这会产生一个错误,提示“无法将类型 'Data.myClass' 隐式转换为 'myClass',但如果我将公共类 Test 更改为公共类 Test 我会得到“类型参数声明必须是标识符而不是类型”。

我显然遗漏了一些东西,因为我不明白这里发生了什么。任何人都可以解释它,或者指出可以更好地解释它的地方吗?

谢谢。

【问题讨论】:

    标签: generics interface


    【解决方案1】:

    我认为您只想从 Test 类中删除泛型参数。

    ... class Test : ITest<myClass> ...
    

    就目前而言,泛型参数名称掩盖了实际类型名称。

    【讨论】:

    • 如果我这样做,“where”会出现错误,指出“非泛型声明上不允许约束”。
    • 哦,'where'位也可以删除。
    • @chirs,你没抓住重点。您还应该删除 Type 约束。在这种情况下,您将创建一个名为 myClass 的通用参数。
    • @bruno:我很确定我错过了什么,这就是我问这个问题的原因 :) 但在这一点上,我什至不知道我错过了什么 - 我可以进行您建议的更改,它可以工作,但我不明白其中的区别。
    【解决方案2】:

    我怀疑问题出在这里:

     _db.myClass.First...
    

    你的意思可能是这样的

    _db.GetAll<myClass>().First...
    

    我认为您将 myClass 作为类型与 myClass 作为 _db 实现的函数混淆了?

    【讨论】:

    • 否,该代码使用 LINQ to Entites 返回具有指定 ID 的 myClass 对象。
    • 所以你有一个 Data.myEntities 属性,每个 T 你可能有一个接口?
    • 因为如果你这样做了,那么 GetByID 必须是一个大的 switch 语句才能根据 typeof(myClass) 调用正确的语句。
    猜你喜欢
    • 2011-03-23
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2023-01-13
    • 1970-01-01
    • 2021-03-29
    • 1970-01-01
    • 2017-10-01
    相关资源
    最近更新 更多