Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

Why does Code Contracts shows "Malformed contract. Found Requires after assignment" in method with params keywork?

I've been troubleshooting with this error for hours and I can't seem to understand why this happens. Consider the following code:

using System;
using System.Diagnostics.Contracts;
using System.Linq.Expressions;

namespace Contracts
{
    class Data
    {
        public object TestData1 { get; set; }
        public object TestData2 { get; set; }
    }

    class Program
    {
        static void Main()
        {
            Data d = new Data();
            Method(d);
        }

        static void Method(Data d)
        {
            Contract.Requires(Methods.TestMethod1("test"));
            Contract.Requires(Methods.TestMethod2("test1", "test2"));
            Contract.Requires(Methods.TestMethod3(d, x => x.TestData1));
            Contract.Requires(Methods.TestMethod4(d, x => x.TestData1, x => x.TestData2));
        }
    }

    static class Methods
    {
        [Pure]
        public static bool TestMethod1(string str) { return true; }

        [Pure]
        public static bool TestMethod2(params string[] strs) { return true; }

        [Pure]
        public static bool TestMethod3<T>(T obj, Expression<Func<T, object>> exp) { return true; }

        [Pure]
        public static bool TestMethod4<T>(T obj, params Expression<Func<T, object>>[] exps) { return true; }
    }
}

When I compile the project, the line "Contract.Requires(Methods.TestMethod4(d, x => x.TestData1, x => x.TestData2));" causes the following compilation error:

Malformed contract. Found Requires after assignment in method 'Contracts.Program.Method(Contracts.Data)'.

How come "Contract.Requires(Methods.TestMethod2("test1", "test2"));" doesn't cause an error but "Contract.Requires(Methods.TestMethod4(d, x => x.TestData1, x => x.TestData2));" does?

Please help! :(

like image 841
Marco Avatar asked Jun 30 '11 15:06

Marco


1 Answers

I posted the problem on the MSDN forums and they think it's a bug too.

like image 151
Marco Avatar answered Sep 23 '22 20:09

Marco