考虑以下情形:为什么我需要在泛型类中明确定义泛型参数的泛型类型?
public interface IEntity<TKey>
{
TKey { get; set; }
}
public interface IRepository<TEntity, TKey>
where TEntity : IEntity<TKey>
{
void Store(TEntity entity);
void Delete(TKey key);
}
为什么我需要expliclty添加TKey
作为通用参数IRepository
?
编译器不能从TEntity
的类型中推论出来吗?
我想实现这样的事情:
public interface IRepository<TEntity>
where TEntity : IEntity<TKey>
{
void Store(TEntity entity);
void Delete(TKey key);
}
它不象TKey
仅在运行时称为:
IRepository<User> userRepo = new ConcreteRepository<User>();
凡User
实现IEntity<string>
编译器遵循一个规范。该规范要求类型参数,它可以这样做是出于很好的理由,因为它避免了含糊不清和额外/复杂的规则:考虑“IEnumerable”和“IEnumerable”,它们都是独立的类型。问题的结尾是令人困惑的,因为TKey是赋予类型域限制的名称,与“运行时”分开。 –
user2864740
编译器是否可以推断它并不相关 - 它没有,这就是它。这很烦人,是的,但这就是它的方式。 CLR规范要求定义每个泛型类型参数。 F#比C#有更好的类型推断,它仍然必须这样做(主要区别在于,当你调用一个只需要'TEntity' :)的方法时,它会推断出正确的类型)。 – Luaan