我有一个非常简单的设计:
具有单个通用参数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();
}
但是编译器对这种语法不满意。
我担心我会遗漏一些明显的东西,但是又是什么?
感谢您的任何见解。
答案 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。