有什么方法可以从C#中的其他类型参数约束中推断出一些类型参数?

时间:2016-11-08 13:48:58

标签: c# generics type-inference nested-generics

假设我有以下代码:

interface IWidget
{
}

interface IWidgetFactory<TWidget>
    where TWidget : IWidget
{
}

TWidgetFactory CreateFactory<TWidgetFactory, TWidget>()
    where TWidgetFactory : IWidgetFactory<TWidget>
    where TWidget : IWidget
{
    return ...
}

每当我调用CreateFactory()时,我必须传入TWidgetFactory和TWidget类型参数。这似乎是不必要的,因为TWidgetFactory已经有一个约束,因此它的任何特化都必须已经指定了TWidget。有没有什么方法可以在调用CreateFactory()时自动推断TWidget,即使我必须为它添加某种额外的帮助方法?

(以上是一个简单的例子,但实际上它会变得复杂得多,因此可以节省很多复杂性。)

1 个答案:

答案 0 :(得分:2)

如果没有看到CreateFactory的正文,很难说出你在做什么。根据返回类型,我怀疑CreateFactory实际上并没有使用TWidget作为接口的类型参数。在这种情况下,你可以放松一下你的通用约束吗?

interface IWidget
{
}

interface IWidgetFactory {} // A new non-generic base interface

interface IWidgetFactory<TWidget> : IWidgetFactory
    where TWidget : IWidget
{
}

// Generic constraints wind up not as specific, 
// but still provide some level of restriction
// TWidget can no longer be used within this method.
TWidgetFactory CreateFactory<TWidgetFactory>()
    where TWidgetFactory : IWidgetFactory
{
    return ...
}