C#能否利用隐式嵌套泛型参数?

C#能否利用隐式嵌套泛型参数?,c#,.net,generics,interface,C#,.net,Generics,Interface,我有一个非常简单的设计: 带有单个通用参数的通用接口IElement: interface IElement<T> { } 以下是我能做的: interface ISource<TElem, T> where TElem : IElement<T> { T GetSomething(); } class IntegersSource : ISource<IElement<int>, int> { publi

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

  • 带有单个通用参数的通用接口
    IElement

    interface IElement<T>
    {
    }
    
    以下是我能做的:

    interface ISource<TElem, T>
        where TElem : IElement<T>
    {
        T GetSomething();
    }
    
    class IntegersSource : ISource<IElement<int>, int>
    {
        public int GetSomething()
        {
            return 1;
        }
    }
    
    我试过:

    interface ISource<TElem>
        where TElem : IElement<T>
    {
        T GetSomething();
    }
    
    接口源
    电话:IELENT在哪里
    {
    得不到某物;
    }
    
    但是编译器对这种语法不满意

    我担心我错过了一些明显的东西,但是什么呢


    谢谢你的见解。

    那是行不通的。图像您拥有以下类:

    class MultiElement : IElement<int>, IElement<double>
    {
        // explicit interface implementations of IElement<int> and IElement<double> here.
    }
    
    类多元素:IELENT,IELENT
    {
    //这里是IElement和IElement的显式接口实现。
    }
    

    现在,当我声明一个
    类MySource:isoource
    时,什么应该被推断为
    T

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

    interface ISource<TElem<T>>
        where TElem : IElement<T>
    {
        T GetSomething();
    }
    
    接口源
    电话:IELENT在哪里
    {
    得不到某物;
    }
    
    以及相应的用法,如:

    class IntegersSource : ISource<IElement<int>>
    
    类整数来源:ISource
    
    即使您必须明确说明编译器可以在何处使用“嵌套”类型参数(请参阅Heinzi针对特定情况的回答)。

    您所需的格式:

    class IntegersSource : ISource<IElement<int>>
    {
        public int GetSomething()
        {
            return 1;
        }
    }
    
    类整数来源:ISource
    {
    公共int GetSomething()
    {
    返回1;
    }
    }
    
    将通用参数提供给ISource-“TElem”-作为
    IElement


    它的“int”部分随后被埋入闭合的类型定义中。虽然您可以阅读,但编译器不知道IntegerSource实现中的int。

    编译器如何知道您上一个列表中的
    T
    是什么?您真的需要
    tele
    IElement
    内部的
    ISourceT
    实现对您来说还不够吗?我看不到
    IElement
    界面有任何额外的好处。我遗漏了什么吗?@O.R.Mapper:类型是在使用接口时指定的。@Dennis:是的,我真的需要两者,但老实说,更简单的设计并不能改变游戏规则,我只是好奇而已。:)我敢肯定C++处理这个。我认为问题在于.Net泛型是编译/动态的,因此表达能力较低。是的,在发布之前,我尝试过这种语法和其他语法,但没有成功/你说得很好,尽管在我的设计中这没有任何意义+1.
    class IntegersSource : ISource<IElement<int>>
    
    class IntegersSource : ISource<IElement<int>>
    {
        public int GetSomething()
        {
            return 1;
        }
    }