Контракты для общего метода теряются и не отображаются в 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);
}
}
Настройки кода кода