将方法的类型参数约束到由另一种类型实现的接口

时间:2010-11-04 10:08:54

标签: c# generics type-constraints

如果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

1 个答案:

答案 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 - 请查看页面末尾标题为“将参数类型化为约束”的部分。