我想为某个接口创建一个代码合同,但是我很难相信它实际上是这样完成的。
[ContractClass(typeof(AsyncCacheProviderContract))]
public interface IAsyncCacheProvider {
Task<bool> GetAsync<T>(string key, out T value);
}
[ContractClassFor(typeof(AsyncCacheProviderContract))]
internal abstract class AsyncCacheProviderContract : IAsyncCacheProvider {
public Task<bool> GetAsync<T>(string key, out T value)
{
Contract.Requires(!String.IsNullOrEmpty(key));
value = default(T);
return Task.Factory.StartNew(() => false);
}
}
合同应确保 1) 所有实现接口的类都要求参数键不为 null 或为空,以及 2) 自动生成检查到构建中,例如类似于
public Task<bool> GetAsync<T>(string key, out T value) {
if(String.IsNullOrEmpty(key))
throw new ArgumentException //...
}
但是在这种特殊情况下,我感到很奇怪,我必须分配out
参数并返回一个虚拟变量Task
才能使编译器满意。有没有更直接的方法,例如使用属性?