9

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

[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课堂,它会在没有警告的情况下编译。

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

2 回答 2

1

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

于 2013-09-27T17:00:14.263 回答
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 也可以应用于外部或内部类。我不知道哪个是正确的,但是这两个位置都不影响编译

于 2013-09-25T18:43:32.120 回答