C# 如何从另一个参数的泛型参数类型推断泛型类型

C# 如何从另一个参数的泛型参数类型推断泛型类型,c#,generics,C#,Generics,MVC与我的问题无关。不要对这个例子感到困惑。这纯粹是个C#问题 我认为问题的标题并不能很好地解释这个问题 假设我有一个用于某些实体类的基类,名为EntityBase 有些课程像 class Entity1 : EntityBase class Entity2 : EntityBase class Controller1 : RepositoryControllerBase<Repository1, Entity1> class Controller2 : RepositoryC

MVC与我的问题无关。不要对这个例子感到困惑。这纯粹是个C#问题

我认为问题的标题并不能很好地解释这个问题


假设我有一个用于某些实体类的基类,名为
EntityBase

有些课程像

class Entity1 : EntityBase
class Entity2 : EntityBase
class Controller1 : RepositoryControllerBase<Repository1, Entity1>
class Controller2 : RepositoryControllerBase<Repository2, Entity2>
我有一个抽象存储库,可以处理实体上的基本操作。宣言是:

abstract class RepositoryBase<TEntity> where TEntity : EntityBase

没有约束类型推断,原因如下:

此外,您的想法的明显反例是使用接口:

interface IEntity1 : IEntityBase {}
interface IEntity2 : IEntityBase {}

interface IRepositoryBase<TEntity> where TEntity : class, IEntityBase {}

class Repository1 : RepositoryBase<IEntity1> {}
class Repository2 : RepositoryBase<IEntity2> {}
class Repository12 : IRepositoryBase<IEntity1>, IRepositoryBase<IEntity2> {}

public abstract class RepositoryControllerBase<TRepository, TEntity> 
    where TRepository : RepositoryBase<TEntity>
    where TEntity : IEntityBase {}

class Controller1 : RepositoryControllerBase<Repository1, Entity1>
class Controller2 : RepositoryControllerBase<Repository2, Entity2>
class Controller12 : RepositoryControllerBase<Repository12, Entity1>
接口IEntity1:IEntityBase{}
接口IEntity2:IEntityBase{}
接口IRepositoryBase,其中tenty:class,IEntityBase{}
类Repository1:RepositoryBase{}
类Repository2:RepositoryBase{}
类Repository12:IRepositoryBase,IRepositoryBase{}
公共抽象类RepositoryControllerBase
存放地点:RepositoryBase
其中tenty:IEntityBase{}
类控制器1:RepositoryControllerBase
类控制器2:RepositoryControllerBase
类控制器12:RepositoryControllerBase

Controller12
定义中没有指定
Entity1
类型参数,编译器应该检查什么?

我没有得到
类Repository12:IRepositoryBase,IRepositoryBase{}
。我试着那样做会出错。这是打字错误吗?哦,对不起,你已经把它们转换成界面了。好吧,这不是打字错误。看起来Java和C以两种不同的方式处理事情。Java不支持
类Repository12:IRepositoryBase、IRepositoryBase{}
和C#不支持自动推理。在我的上下文中,java解决方案似乎更合理。@Mohaimin为什么?java解决方案允许您编写更少的代码(通过自动推断一些约束),但禁止您做一些干扰类型推断的事情。C#强制您显式地编写类型约束,但随后允许您实现多个接口。很抱歉,我迟到了。我更喜欢java版本,因为
Repository12:IRepositoryBase,IRepositoryBase{}
令人困惑。如果
IRepositoryBase
包含类似
TEntity GetEntity()
的方法,该怎么办?我试过这个。我找不到从
Repository12
class Controller1 : RepositoryControllerBase<Repository1, Entity1>
class Controller2 : RepositoryControllerBase<Repository2, Entity2>
public abstract class RepositoryControllerBase<TRepository> 
            where TRepository : RepositoryBase<?>
interface IEntity1 : IEntityBase {}
interface IEntity2 : IEntityBase {}

interface IRepositoryBase<TEntity> where TEntity : class, IEntityBase {}

class Repository1 : RepositoryBase<IEntity1> {}
class Repository2 : RepositoryBase<IEntity2> {}
class Repository12 : IRepositoryBase<IEntity1>, IRepositoryBase<IEntity2> {}

public abstract class RepositoryControllerBase<TRepository, TEntity> 
    where TRepository : RepositoryBase<TEntity>
    where TEntity : IEntityBase {}

class Controller1 : RepositoryControllerBase<Repository1, Entity1>
class Controller2 : RepositoryControllerBase<Repository2, Entity2>
class Controller12 : RepositoryControllerBase<Repository12, Entity1>