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

mad*_*soj 2 c# generics

我已经创建了一个接口,以便我可以尝试使一些重复的代码通用.

public interface IIdentifiable<T>
{
    T Id { get; set; }
}
Run Code Online (Sandbox Code Playgroud)

然后我有一个与实体一起工作的类,其约束条件为 IIdentifiable<T>

public class MyClass<TEntity, TId>
    where TEntity : IIdentifiable<TId> {}
Run Code Online (Sandbox Code Playgroud)

但是现在每当我使用时MyClass我都必须传入,TId即使只有一种有效类型TId.

public class MyEntity : IIdentifiable<Guid> {}

var foo = new MyClass<MyEntity>(); // Error
var bar = new MyClass<MyEntity, Guid>();
Run Code Online (Sandbox Code Playgroud)

在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;
Run Code Online (Sandbox Code Playgroud)

是否有C#等价物?

Luc*_*ski 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?
Run Code Online (Sandbox Code Playgroud)

此外,C#泛型不像C++模板那样工作,它们在运行时具有固定性并且具有不同的约束.