Доброго времени суток!
Знакомясь с контрактами, наткнулся на ситуацию, которую не знаю как разрулить. Код простой:
public static object Get(Exception ex)
{
Contract.Requires<ArgumentNullException>(ex != null);
if (!Exists(ex))
{
throw new InvalidOperationException(String.Format(MyErrorMessage, ex));
}
return ex.Data[MyKey];
}
[Pure]
public static bool Exists(Exception ex)
{
...
}
Хочу втащить Exists(ex) в контракт. Как-то так:
public static object Get(Exception ex)
{
Contract.Requires<ArgumentNullException>(ex != null);
Contract.Requires<InvalidOperationException>(Exists(ex), String.Format(MyErrorMessage, ex));
return ex.Data[MyKey];
}
Но получаю сообщение
User message to contract call can only be string literal, or a static field, or static property that is at least internally visible. А мне в данном случае хочется не просто сказать, что контракт нарушен, а еще показать для каких входных данных он нарушен. Понятно, что такая возможность будет работать только в runtime, но именно она и нужна. Можно как-нибудь побороть и использовать String.Format в сообщении?
Здравствуйте, MxMsk, Вы писали:
M>Можно как-нибудь побороть и использовать String.Format в сообщении?
Пока нет.
У вас VS2010 и code contracts v1.4.30903.0, так? У меня такого сообщения вроде бы не было. Завтра проверю, если не забуду
P.S. Пока не выйдет RTM, rewriter лучше вообще не использовать.
Сырое оно ещё.
Здравствуйте, MxMsk, Вы писали:
MM>Но получаю сообщение
Проверил — то же самое. Как я не наткнулся на эту ошибку раньше —