Si escribo esto:¿Es esto un error en el comprobador de contrato estático?
public sealed class Foo
{
private int count;
private object owner;
private void Bar()
{
Contract.Requires(count > 0);
Contract.Ensures(owner == null || count > 0);
if (count == 1)
owner = null;
--count;
}
}
El corrector contrato estática puede probar todas las afirmaciones.
Pero si escribo esto en su lugar:
public sealed class Foo
{
private int count;
private object owner;
private void Bar()
{
Contract.Requires(count > 0);
Contract.Ensures(owner == null || count > 0);
--count;
if (count == 0)
owner = null;
}
}
Se afirma que la condición posterior owner == null || count > 0
no está comprobada.
creo que puedo probar la segunda forma no viola esta condición posterior:
// { count > 0 } it's required
--count;
// { count == 0 || count > 0 } if it was 1, it's now zero, otherwise it's still greater than zero
if (count == 0)
{
// { count == 0 } the if condition is true
owner = null;
// { count == 0 && owner == null } assignment works
}
// { count == 0 && owner == null || count != 0 && count > 0 } either the if was entered or not
// { owner == null || count > 0 } we can assume a weaker postcondition
algo mal con mi prueba?
he añadido las afirmaciones en mi prueba como Contract.Assert
llamadas al código, y llegaron a la conclusión de que si añado simplemente éste, se las arregla para probar la condición posterior:
--count;
Contract.Assert(count == 0 || count > 0)
if (count == 0)
owner = null;
Pero, si ahora cambia esa misma afirmación de una manera "más natural", se produce un error:
--count;
Contract.Assert(count >= 0)
if (count == 0)
owner = null;
sería de esperar que estas dos afirmaciones son equivalentes, pero el de electricidad estática los trata de manera diferente.
(estoy usando la beta 2 de VS10 por cierto)
Como nadie me ha demostrado que estoy equivocado hasta ahora, lo tomaré como un error y presentaré un informe. Ahora, ¿dónde puedo hacer eso? Google al rescate ... –
Connect parece odiarme, o mi conexión, o Chrome. Agradecería que alguien informara este error por mí ... –