2010-09-04 21 views
7

El siguiente código me da la advertencia Contract class 'FooContracts' should be an abstract class. De todos los ejemplos que he leído en línea (por ejemplo, http://www.infoq.com/articles/code-contracts-csharp), esto debería funcionar (presumiblemente sin advertencias del compilador).La clase de contrato debe ser una clase abstracta

[ContractClass(typeof(FooContracts))] 
public interface IFoo { 
    void Bar(string foo); 
} 

[ContractClassFor(typeof(IFoo))] 
internal sealed class FooContracts : IFoo { 
    void IFoo.Bar(string foo) { 
    Contract.Requires(foo != null); 
    } 
} 

estoy en Visual Studio 2010, con las siguientes opciones en la sección Code Contracts de las propiedades del proyecto:

  • Realizar tiempo de ejecución del contrato de control (conjunto de Full)
  • Realizar Contrato estática Comprobación (debajo de Static Checking)
  • Entrada en el fondo

También definí el símbolo de compilación CONTRACTS_FULL para que ReSharper se apague.

¿Me falta algo para hacer esta compilación sin advertencias?

Respuesta

9

Sección 2.8 del code contracts manual establece específicamente que debe ser una clase abstracta:

Las herramientas esperan que la clase de contrato es abstracta e implementa la interfaz que está proporcionando los contratos para .

+1

huh. Gracias por el enlace. ese hecho nunca fue mencionado ni demostrado en ningún código de ejemplo que encontré. – tmont

3

Lo más probable es que el artículo de InfoQ al que hace referencia sea incorrecto. Se basa en una edición de "acceso anticipado" de C# en profundidad, por lo que la implementación de contratos de código probablemente haya cambiado entre el momento en que se escribió originalmente el capítulo/artículo y se lanzó .NET 4.

El siguiente código debería funcionar:

[ContractClass(typeof(FooContracts))] 
public interface IFoo { 
    void Bar(string foo); 
} 

[ContractClassFor(typeof(IFoo))] 
internal abstract class FooContracts : IFoo { 
    void IFoo.Bar(string foo) { 
    Contract.Requires(foo != null); 
    } 
} 

clase El contrato debe ser abstracta.

+0

Pero hacer que la clase sea abstracta significa que no se puede volver a implementar después de implementar la interfaz :(¿Alguna alternativa al respecto? ¿Otra que crear una nueva clase concreta que hereda de la clase abstracta? – bitek

+1

@MnemonicFlow No debería crear instancias de la clase de contrato de todos modos. Es solo para uso del motor de contratos de código. – piedar

Cuestiones relacionadas