通用方法的合同正在丢失,并且不会出现在IL中。下面是一个代码示例。如果您刚刚从界面中删除了非泛型,那么通用合同将按预期工作。但是,在非通用的情况下,通用合同在重写时就会丢失。
[ContractClass(typeof(IContractTestContract))]
interface IContractTest
{
string TestMethod(string arg);
T TestMethod<T>(string arg);
}
[ContractClassFor(typeof(IContractTest))]
abstract class IContractTestContract : IContractTest
{
public string TestMethod(string arg)
{
Contract.Requires(!String.IsNullOrEmpty(arg));
throw new NotImplementedException();
}
public T TestMethod<T>(string arg)
{
Contract.Requires(!String.IsNullOrEmpty(arg));
throw new NotImplementedException();
}
}
class ContractTest : IContractTest
{
public string TestMethod(string arg) { return null; }
public T TestMethod<T>(string arg) { return default(T); }
}
class Program
{
static void Main(string[] args)
{
var c = new ContractTest();
//Does not fail static or runtime checks
//Contract is getting lost
c.TestMethod<string>(null);
}
}
代码合约设置