C#泛型-泛型类型约束

时间:2019-06-03 16:35:47

标签: c# generics higher-kinded-types

我具有以下通用类型层次结构:

interface IGenericInterface<TId, TValue>
{…}

class A : IGenericInterface<long, string>

我想设计一个以IGenericInterface作为类型的通用类型。 编译器允许的解决方案是:

class SomeType<TType, TId, TValue> where TType : IGenericInterface<TId, TValue>

当我需要继承这样的类型时,我需要指定:

class Derived : SomeType<A, long, string>

这似乎在指定第二和第三类型参数方面是多余的,因为类A已经是IGenericInterface<long, string>了。

有没有一种方法可以实现我想要的-优雅的派生类?

3 个答案:

答案 0 :(得分:2)

您可以添加一个中间接口,并为此设置SomeType约束。像这样:

interface IA : IGenericInterface<long,string> { }

class A : IA {}

class SomeType<TType> where TType : IA { }

class Derived : SomeType<A> { }

答案 1 :(得分:1)

您说得对,您的观点很明智,很遗憾,还尚不支持。您所追求的被称为更高种类的参数多态性,这是函数式编程爱好者急切想要的功能。

Roslyn feature

答案 2 :(得分:0)

这样的帮助吗? (我认为IEnumerable做的事情类似)

internal interface IGenericInterface
interface IGenericInterface <TId, TValue> : IGenericInterface
class SomeType<TType> where TType : IGenericInterface