我已经创建了一个界面,以便我可以尝试使一些重复的代码通用。
public interface IIdentifiable<T>
{
T Id { get; set; }
}
然后我有一个与实体一起工作的类,约束为IIdentifiable<T>
public class MyClass<TEntity, TId>
where TEntity : IIdentifiable<TId> {}
但现在每当我使用MyClass
时,即使TId
只有一种有效类型,我也必须传递TId
。
public class MyEntity : IIdentifiable<Guid> {}
var foo = new MyClass<MyEntity>(); // Error
var bar = new MyClass<MyEntity, Guid>();
在C ++中,我可以这样做:
template<typename T>
struct IIdentifiable
{
using id_type = T;
T id;
};
template<typename TEntity, typename TId = typename TEntity::id_type>
struct MyClass {};
MyClass<MyEntity> foo;
是否有C#等价物?
答案 0 :(得分:5)
只有一种有效类型
TId
错误!:)
反例:
public class MyEntity : IIdentifiable<Guid>
{
public Guid Id { get; set; }
}
public class MyOtherEntity : MyEntity, IIdentifiable<int>
{
int IIdentifiable<int>.Id { get; set; }
}
var foo = new MyClass<MyOtherEntity>(); // So, which IIdentifiable should be used?
此外,C#generics不像C ++模板一样工作,它们在运行时具有不同的约束条件。