2010-10-03 7 views
7

Una clase estoy escribiendo implementos IDictionary<string, object>. En mi implementación CopyTo, me gustaría usar contratos de código: cosas como Contract.Requires<ArgumentNullException>(array != null).¿Cómo usar contratos de código cuando se deriva de interfaces como IDictionary <T, U>?

Pero, me sale esta advertencia (con algunos espacios de nombres retirados para facilitar la lectura):

Método 'LuaDictionary.CopyTo(KeyValuePair<String,Object>[],Int32)' implementa método de interfaz 'ICollection<KeyValuePair<String,Object>>.CopyTo(KeyValuePair<String,Object>[],Int32)', por lo que no se puede agregar Requires.

Veo que hay algunas preguntas relacionadas, pero todas parecen tener que ver con interfaces que están bajo el control del usuario. Obviamente, IDictionary<T, U> no está bajo mi control, así que no puedo anotarlo con ContractClassFor ni nada de eso.

Entonces, ¿no puedo usar contratos de código aquí? Si es así ... gran fastidio ...

Respuesta

5

Es un fastidio, pero es comprensible porque el código del cliente que utiliza instancias de su clase como IDictionary<string, object> no debería tener que cumplir las condiciones previas que no se esperan de IDictionary<string, object>.

Puede leer la respuesta proporcionada a this SO question, que enlaza con y cita el Código de Contratos Manual del usuario, y se puede ver en this article, lo que explica la situación de esta manera, y se va a dar un ejemplo sencillo:

Tenga en cuenta que el principio de sustitución de Liskov es válido para los Contratos de código de forma muy similar a las clases simples. Los principios de Liskov dicen lo siguiente:

Las subclases siempre deben ser sustituibles por sus clases base.

En términos de API de contratos de código, esto significa que una clase derivada (o una clase que implementa una interfaz basada en contrato) no debe esperar más precondiciones que la primaria.

5

Tenga en cuenta que ya tiene IDictionary<K,V> que Requires :)

Puede ver los archivos DLL contratos existentes para las clases en: C:\Program Files (x86)\Microsoft\Contracts.

Si abre mscorlib.Contracts.dll usando Reflector, puede ver los contratos para las clases de colección; CopyTo tiene la siguiente:

public void CopyTo(T[] array, int arrayIndex) 
{ 
    Contract.Requires((bool)(array != null), null, "array != null"); 
    Contract.Requires((bool)(arrayIndex >= 0), null, "arrayIndex >= 0"); 
    Contract.Requires((bool)((arrayIndex + this.Count) <= array.Length), null, "arrayIndex + this.Count <= array.Length"); 
} 
+2

pena señalar que esta información es ahora visible usando el plugin "Código Extensiones contratos Editor" para VS: http://visualstudiogallery.msdn.microsoft.com/85f0aa38-a8a8-4811-8b86 -e7f0b8d8c71b / – porges

Cuestiones relacionadas