#c#-4.0 #iqueryable #code-contracts
#c #-4.0 #iqueryable #код-контракты
Вопрос:
Мне трудно понять, почему я получаю нарушение контракта с кодом в следующем фрагменте кода:
// 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. Не могли бы вы предоставить трассировку стека исключений? Какое из двух назначений выдает его?
Ответ №1:
Похоже, ему нужен реальный класс в качестве контракта. Что вы можете сделать, так это:
var serviceQuery = CreateDataService().DividendData;
Contract.Assume(serviceQuery != null);
Contract.Assume(serviceQuery.Any());
var data = serviceQuery.ToList().Select(div => {I = 2});
В любом случае, это очень странно, что вы там делаете…
Комментарии:
1. Кроме того, кажется, что вы запускаете службу дважды, возможно, вы захотите поместить результат в переменную, а затем проверить, есть ли в ней элементы
2. Итак, я тоже не понимаю, почему это странно? Я пытаюсь выбрать подмножество данных (только определенные столбцы) из службы данных DividendData WCF.