如果IRegistration<Foo>.As<IFoo>
实施Foo
,则以下内容仅允许调用IFoo
:
interface IRegistration<TImplementation>
{
void As<TContract>() where TImplementation : TContract;
}
C#3.0编译器不允许这样做。我收到以下错误:
'SomeNamespace.IRegistration.As()'没有定义类型 参数'TImplementation'
除了将两个类型参数放在方法声明中之外,还有其他方法吗?
这个问题的灵感来自other question about Autofac。
答案 0 :(得分:3)
您正尝试在类型参数列表中不存在的类型参数上添加约束。
这是你的意思吗?
interface IRegistration<TImplementation> where TImplementation : TContract
{
void As<TContract>();
}
虽然这也不会编译 - 你不能对泛型类型有通用约束。
这将编译,但可能不会产生你想要的方法本身的约束:
interface IRegistration<TImplementation,TContract> where TImplementation : TContract
{
void As<TContract>();
}
看看是否会这样做:
interface IRegistration<TImplementation,TContract> where TImplementation : TContract
{
void As();
}
这样,只要您使用TImplementation
,它就会被限制为TContract
,您仍然可以在TContract
方法中使用As
。
您可以找到更多信息here - 请查看页面末尾标题为“将参数类型化为约束”的部分。