2009-08-09 3 views
5

Estaba jugar un poco para responder a la pregunta de alguien aquí en desbordamiento de pila, cuando me di cuenta de una advertencia de verificación estática desde el interior de mi Visual Studio (2008):. Contratos de código .NET: ¿puede ser más básico que esto?

string[] source = { "1", "A", "B" }; 
var sourceObjects = Array.ConvertAll(source, c => new Source(c)).ToArray(); 

Estoy recibiendo el mensaje requiere fuente probada! = nulo. Me parece bastante obvio que este no es el caso. Este es solo un ejemplo, por supuesto. Por otro lado, algunas cosas bastante ingeniosas parecen estar funcionando bastante bien.

Estoy usando la versión 1.2.20518.12 (18 de mayo). Encuentro que los contratos de código son muy interesantes, pero ¿alguien más tuvo casos como este? ¿Considera que la implementación actual puede utilizarse en la práctica, o los consideraría puramente académicos en este punto?

que he hecho esto un wiki de la comunidad, pero me gustaría escuchar algunas opiniones :)

Respuesta

16

tiene más sentido si divide las dos llamadas a:

string[] source = { "1", "A", "B" }; 
var tmp = Array.ConvertAll(source, c => new Source(c)); 
var sourceObjects = tmp.ToArray(); 

Ahora apunta a la última línea como el problema. En otras palabras, la llamada al Array.ConvertAll sabe que la fuente no es nula, pero la llamada al ToArray() no sabe que tmp no será nulo.

(Su ejemplo también es un poco confuso debido al uso del nombre source en su código fuente - el error aún usaría source incluso si llamara a su variable algo completamente diferente, ya que se refiere al primer parámetro en Enumerable.ToArray.)

Básicamente, creo que todo esto funcionará cuando Array.ConvertAll obtenga una condición de postulación adecuada que no sea de nulidad. Hasta entonces, esto va a hacer el truco:

string[] source = { "1", "A", "B" }; 
var tmp = Array.ConvertAll(source, c => new Source(c)); 
Contract.Assume(tmp != null); 
var sourceObjects = tmp.ToArray(); 

acepto este tipo de cosas es molesto, pero estoy seguro de que va a mejorar rápidamente como MS añade más y más contratos en el BCL. Es importante tener en cuenta que es no un problema con el comprobador estático en sí.

(De hecho, Array.ConvertAll no tiene una condición previa o bien - si se establece la variable source en nulo en el segundo fragmento de código anterior, todavía sería no se quejan.)

+1

ya través de la escritura del capítulo contratos? :) –

+1

Casi allí, sí :) Me ha impresionado mucho, para ser sincero. –

+1

Todavía no he buceado tanto en el trabajo interno, pero ¿cómo se definen las condiciones previas y las postcondiciones para los métodos ya presentes en las versiones existentes de la biblioteca de clases base? ¿Supongo que acaban de descartar todo lo que normalmente se genera en la distribución? – Thorarin

Cuestiones relacionadas