通用接口的嵌套合同

时间:2013-09-20 09:20:31

标签: c# generics interface code-contracts

我可以为非通用接口设置嵌套合同类型:

[ContractClass(typeof(Foo.FooContracts))]
public interface IFoo
{
    string Bar(object obj);
}

但是当我尝试使用通用接口做同样的事情时,它会抱怨:

[ContractClass(typeof(Foo.FooContracts<>))]
public interface IFoo<T>
{
    string Bar(T obj);
}

警告是:

  

合同类Foo+FooContracts`1和类型IFoo`1必须具有相同的声明类型(如果有)。

如果我从FooContracts课程中获得Foo,则会在没有警告的情况下进行编译。

  • 为什么通用接口存在这种限制?
  • 为什么非通用的限制不存在?

2 个答案:

答案 0 :(得分:1)

存在限制的原因是我们需要将合​​同从声明点复制到插入点,如果存在泛型类,则会变得更加复杂。实际上没有必要将契约类嵌套在我看到的其他类型中。

答案 1 :(得分:0)

此代码在我的机器上编译(VS2012,.NET 4.5)

[ContractClass(typeof(Foo.FooContracts<>))]
public interface IFoo<T> {
    string Bar(T obj);
}

[ContractClassFor(typeof(IFoo<>))]
public class Foo {
    public class FooContracts<T> : IFoo<T> {
        public string Bar(T obj) {
            throw new NotImplementedException();
        }
    }
}

我添加了ContractClassForAttribute,但我可以把它拿出来。

编辑:也可以将ContractClassForAttribute应用于外部或内部类。我不知道哪个是正确的,但这两个位置都不会影响编译