我可以为非通用接口设置嵌套合同类型:
[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
,则会在没有警告的情况下进行编译。
答案 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应用于外部或内部类。我不知道哪个是正确的,但这两个位置都不会影响编译