Ошибка в кодовых контрактах 1.4.40602.0, когда универсальный и неуниверсальный метод имеют одно и то же имя и параметры? - PullRequest
1 голос
/ 10 декабря 2011

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

Настройки кода кода Settings

1 Ответ

1 голос
/ 13 января 2012

Microsoft подтвердила это как ошибку в контрактах кода, и это уже исправлено внутри.Он будет выпущен в следующей публичной сборке.

Microsoft Ticket

...