2010-10-03 7 views
7

Eine Klasse Ich schreibe implementiert IDictionary<string, object>. In meiner CopyTo Implementierung möchte ich Code-Verträge verwenden: Zeug wie Contract.Requires<ArgumentNullException>(array != null).Wie Code-Verträge zu verwenden, wenn von Schnittstellen wie IDictionary <T, U> abgeleitet werden?

Aber, bekomme ich diese Warnung (mit einigen Namensräume für Lesbarkeit entfernt):

Methode ‚LuaDictionary.CopyTo(KeyValuePair<String,Object>[],Int32)‘ implementiert Interface-Methode ‚ICollection<KeyValuePair<String,Object>>.CopyTo(KeyValuePair<String,Object>[],Int32)‘ kann somit nicht Requires hinzufügen.

Ich sehe, dass es einige verwandte Fragen gibt, aber sie scheinen alle mit Schnittstellen zu tun zu haben, die vom Benutzer kontrolliert werden. Offensichtlich ist IDictionary<T, U> nicht unter meiner Kontrolle, also kann ich es nicht mit oder etwas ähnlichem kommentieren.

Also kann ich Code Contracts hier nicht verwenden? Wenn ja ... Haupt Bummer ...

Antwort

5

Es ist ein doofer, aber es ist verständlich, da Client-Code, die Instanzen der Klasse als IDictionary<string, object> verwendet sollten nicht Voraussetzungen erfüllen, die nicht von IDictionary<string, object> erwartet werden.

können Sie die zu this SO question, sofern Antwort lesen, die Links und zitiert den Kodex Handbuch Verträge, und Sie können auf this article suchen, die die Situation auf diese Weise erklärt, und geht auf ein einfaches Beispiel zu bieten:

Beachten Sie, dass das Substitutionsprinzip von Liskov für Code Contracts genauso gilt wie für einfache Klassen. Die Liskov-Prinzipien sagen Folgendes:

Unterklassen sollten immer für ihre Basisklassen substituierbar sein.

In Bezug auf die API Code Contracts bedeutet dies, dass eine abgeleitete Klasse (oder eine Klasse, die eine vertragsbasierte Schnittstelle implementiert) keine weiteren Vorbedingungen als Eltern erwarten sollte.

5

Beachten Sie, dass IDictionary<K,V> bereits, dass Requires :)

Sie hat, kann die bestehenden Verträge DLLs für die Klassen unter anzuzeigen: C:\Program Files (x86)\Microsoft\Contracts.

Wenn Sie mscorlib.Contracts.dll mit Reflector öffnen, können Sie die Verträge für die Sammlungsklassen anzeigen; CopyTo hat folgendes:

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

Bemerkenswert, dass diese Informationen jetzt sichtbar ist, den „Code Contracts Editor Extensions“ Plug-In für VS mit: http://visualstudiogallery.msdn.microsoft.com/85f0aa38-a8a8-4811-8b86 -e7f0b8d8c71b / – porges