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.
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
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