为什么类型推断不能从约束中确定类型

时间:2016-04-18 12:09:03

标签: c# generics

我已经创建了一个界面,以便我可以尝试使一些重复的代码通用。

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#等价物?

1 个答案:

答案 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 ++模板一样工作,它们在运行时具有不同的约束条件。