考慮以下情形:爲什麼我需要在泛型類中明確定義泛型參數的泛型類型?
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