C#可以利用隐式嵌套泛型参数吗?

时间:2014-02-10 12:41:12

标签: c# .net generics interface

我有一个非常简单的设计:

  • 具有单个通用参数IElement<>的通用接口T

    interface IElement<T>
    {
    }
    
  • 管理ISource<>
  • 的另一个通用接口IElement<>

ISource<>我有一个返回基础类型IElement<>的方法:

T GetSomething();

这是我能做的:

interface ISource<TElem, T>
    where TElem : IElement<T>
{
    T GetSomething();
}

class IntegersSource : ISource<IElement<int>, int>
{
    public int GetSomething()
    {
        return 1;
    }
}

但必须重复嵌套类型int

我想要像:

class IntegersSource : ISource<IElement<int>>
{
    public int GetSomething()
    {
        return 1;
    }
}

我试过了:

interface ISource<TElem>
    where TElem : IElement<T>
{
    T GetSomething();
}

但是编译器对这种语法不满意。

我担心我会遗漏一些明显的东西,但是又是什么?

感谢您的任何见解。

3 个答案:

答案 0 :(得分:4)

那不行。图片您有以下课程:

class MultiElement : IElement<int>, IElement<double>
{
    // explicit interface implementations of IElement<int> and IElement<double> here.
}

现在当我宣布class MySource : ISource<MultiElement>时,应该推断为T

答案 1 :(得分:1)

不幸的是,这是不可能的。我想象一下这样的语法:

interface ISource<TElem<T>>
    where TElem : IElement<T>
{
    T GetSomething();
}

和相应的用法如:

class IntegersSource : ISource<IElement<int>>

即使您必须明确说明编译器可以预期“嵌套”类型参数的位置(请参阅 Heinzi 对特定情况的回答)。

答案 2 :(得分:1)

您想要的格式:

class IntegersSource : ISource<IElement<int>>
{
    public int GetSomething()
    {
        return 1;
    }
}

为ISource提供通用参数 - “TElem” - 为IElement<int>

它的'int'部分随后被隐藏在关闭类型定义中。虽然可以读取它,但编译器并不知道IntegersSource实现中的int。