0

假设我有以下代码:

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。有什么方法可以在调用时自动推断 TWidget CreateFactory(),即使我必须为其添加某种额外的辅助方法?

(上面是一个简单的例子,但在实践中可能会变得更加复杂,所以这可以节省很多复杂性。)

4

1 回答 1

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 ...
}
于 2016-11-08T13:56:02.077 回答