2011-02-13 11 views
5

Considere el siguiente código:¿Cómo decir los contratos de código que un delegado especificado como argumento es puro?

int SomeField; 
void Foo([Pure] Func<int, object> getData) 
{ 
    Contract.Requires(getData != null); 
    Contract.Requires(getData(this.SomeField) != null); 
} 

me sale el siguiente aviso:

llamada Detectado al método 'System.Func'2<System.Int32,System.Object>.Invoke(System.Int32)' sin [Pure] en los contratos de método '.... Foo(System.Func'2<System.Int32,System.Object>)'

Esta advertencia tiene mucho sentido. Pero aún me gustaría llamar al delegado en los contratos y no recibir una advertencia (supongamos que las advertencias se convirtieran en errores). ¿Cómo logro eso?

He intentado el atributo Pure, como se muestra en el ejemplo, pero eso no funciona.

También me gustaría saber por qué el PureAttribute se puede especificar en los parámetros. No tendría sentido si el tipo del parámetro no fuera un tipo de delegado, y aunque lo sea, no funciona como esperaba, como dije anteriormente.

Respuesta

1

La manera de hacer esto con la biblioteca contratos código actual es declarar su propio tipo de delegado, así:

[Pure] 
public delegate U PureFunc<in T, out U>(T thing); 

Creo que la razón por la que no funciona en los parámetros de delegados es que sería ser muy difícil de verificar en general :)

+0

Ok, esa es una solución, aunque no muy elegante, ya que eso requeriría el envío de delegados en otras partes del código, pero está bien, es aceptable. Pero la cuestión es que cuando PureAttribute se asigna a un método o un delegado, no se comprueba su pureza, simplemente se supone. Entonces, ¿por qué no puedo especificar un parámetro de delegado para ser puro? – JBSnorro

+0

Creo que la diferencia está entre * declarar * algo para ser puro y * requerir * que sea. Cuando declaras un método Pure que es una opción activa, pero asumiendo implícitamente que los delegados son puros solo porque el parámetro no es muy ideal. En ese caso, el usuario del método quizás ni siquiera sepa que el parámetro es Puro, y podría pasar algo que se romperá. De esta forma, se requiere que el usuario del método diga "sí, sé que esto tiene que ser puro". – porges

1

No estoy acostumbrado al marco contractual, pero desde un punto de vista puramente lógico un delegado no puede ser puro, simplemente porque puede tomar cualquier método que cumpla con la firma. No hay forma de que pueda garantizar que todos los métodos se ajusten a ese delegado, ya que solo requiere uno para romper el contrato.

+0

Ok. Eso hace sentir también. Obviamente, no todos los delegados son puros. Eso no significa que algunos no pueden ser, y creo que debería haber un mecanismo para especificar eso. Pero esto generó una segunda pregunta ... Editaré mi publicación. – JBSnorro

Cuestiones relacionadas