使用IQueryable投影到匿名类型的代码合同违规

时间:2011-11-11 08:42:22

标签: c#-4.0 iqueryable code-contracts

我很难理解为什么我在下面的代码中遇到代码合同违规行为:

     // servicequery is of type System.Data.Services.Client.DataServiceQuery<DividendData>
     // therefore implements IQueryable
     var serviceQuery = CreateDataService().DividendData;
     Contract.Assume(serviceQuery != null);
     Contract.Assume(serviceQuery.Any());
     var data = serviceQuery
        .Select(div => new {I = 2});

违规行为是:CodeContracts: requires unproven: constructor != null正确分配。

如果我将此代码更改为以下内容,则违规将消失:

  class resulttype
  {
     public int I { get; set; }
  }


  var serviceQuery = CreateDataService().DividendData;
  Contract.Assume(serviceQuery != null);
  Contract.Assume(serviceQuery.Any());
  var data = serviceQuery
     .Select(div => new resulttype() {I = 2});

我的问题是'为什么?'。

1 个答案:

答案 0 :(得分:0)

似乎需要一个实际的课程作为合同。你能做的是:

var serviceQuery = CreateDataService().DividendData;
Contract.Assume(serviceQuery != null);
Contract.Assume(serviceQuery.Any());
var data = serviceQuery.ToList().Select(div => {I = 2});

无论如何,你在那里做的很奇怪......