尝试在模板上使用抽象静态接口时,为什么 C# 编译器会给出 CS0704 错误?

问题描述 投票:0回答:1

我正在尝试实现一个 C# 静态抽象接口。我已阅读文档和博客,但我看不出我做错了什么。

  public interface IModel
  {
    abstract static PropertyInfo KeyProperty { get; }
    abstract static string TableName { get; }
  }

  public abstract record Model<TKey>: IModel
  {
    public static PropertyInfo KeyProperty { get; }
    public static string TableName { get; }
    ...
  }

  public Repository<TModel, TKey> where TModel : Model<TKey>
  {
    public void SomeMethod()
    {
      // This throws a compiler error: "CS0704 Cannot do non-virtual member lookup in 'TModel' because it is a type parameter"
      var col = TModel.KeyProperty.Name;
    }
  }
c# static
1个回答
0
投票

由于某种原因,编译器无法确定 TModel 实现了 IModel,即使它继承自实现了 IModel 的类。幸运的是,解决方案很简单。而不是这个:

  public Repository<TModel, TKey> where TModel : Model<TKey>

这样做:

  public Repository<TModel, TKey> where TModel : Model<TKey>, IModel
© www.soinside.com 2019 - 2024. All rights reserved.