泛型方法约束错误-请考虑改用显式接口实现

本文关键字:显式接口实现 约束 错误 泛型方法 | 更新日期: 2023-09-27 18:26:37

我有这个方法:

public T GetRepositoryByType<T>() where T : IContextDependent
{
    var instance = this.Repositories.SingleOrDefault(x => x is T);
    return (T)instance;
}

它需要能够返回任何实现IContextDependent的存储库实例,这样我就可以手动为每个实例设置DbContext。

当我构建时,我得到了这个错误:

错误CS0425方法的类型参数"T"的约束"RepositoryProvider.GetRepositoryByType()"必须与接口方法的类型参数"T"的约束"IRepositoryProvider.GetRepositoryByType()"。请考虑使用而是显式接口实现。

但是,如果我考虑MSDN中的代码:

void SwapIfGreater<T>(ref T lhs, ref T rhs) where T : System.IComparable<T>
{
    T temp;
    if (lhs.CompareTo(rhs) > 0)
    {
        temp = lhs;
        lhs = rhs;
        rhs = temp;
    }
}

我看不出直接的区别(除非需要进一步的泛型依赖性?)。

仅供参考,界面非常简单:

public interface IContextDependent
{
    void SetContext(MyEntities context);
}

以及IRepositoryProvider接口:

public interface IRepositoryProvider
{
    T GetRepositoryByType<T>();
}

错误的原因是什么?

泛型方法约束错误-请考虑改用显式接口实现

RepositoryProvider.GetRepositoryByType()'必须与接口方法'IRepositoryProvider.GetRepositoryByType'的类型参数'T'的约束匹配

您对RepositoryProvider的限制是:where T : IContextDependent
因此,您对IRepositoryProvider的约束也必须where T : IContextDependent

也就是说,你的界面应该写如下:

public interface IRepositoryProvider
{
    T GetRepositoryByType<T>() where T : IContextDependent;
}