2010-09-04 22 views
7

Poniższy kod daje mi ostrzeżenie Contract class 'FooContracts' should be an abstract class. Ze wszystkich przykładów, które przeczytałem online (np. http://www.infoq.com/articles/code-contracts-csharp), to powinno działać (prawdopodobnie bez ostrzeżeń kompilatora).Klasa zamówienia powinna być klasą abstrakcyjną

[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); 
    } 
} 

jestem w Visual Studio 2010, z następującymi ustawieniami w sekcji Code Contracts właściwości projektu:

  • Wykonaj Runtime kontraktu Sprawdzanie (zestaw do Full)
  • Wykonaj Static kontraktu Sprawdzanie (pod Static Checking)
  • Sprawdź w tle

Zdefiniowałem również symbol kompilacji CONTRACTS_FULL, aby zamknąć ReSharper.

Czy brakuje mi czegoś, co zmusi do kompilacji bez ostrzeżeń?

Odpowiedz

9

Sekcja 2.8 z code contracts manual wyraźnie stanowi, że powinna ona być klasą abstrakcyjną:

Narzędzia oczekiwać, że klasa jest abstrakcyjna kontrakt i implementuje interfejs jest dostarczanie umów dla.

+1

huh. dzięki za link. ten fakt nigdy nie został wspomniany ani zademonstrowany w jakimkolwiek przykładowym kodzie, który znalazłem. – tmont

3

Najprawdopodobniej artykuł, do którego się odwołuje, jest niepoprawny. Jest oparty na "wczesnym dostępie" do edycji C# in Depth, więc implementacja kodu prawdopodobnie zmieniła się między początkiem pisania rozdziału i artykułu a wydaniem .NET 4.

Poniższy kod powinien działać:

[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); 
    } 
} 

klasa Umowa musi być abstrakcyjne.

+0

Ale sprawienie, że klasa jest abstrakcyjna, oznacza, że ​​nie można jej zaktualizować po zaimplementowaniu interfejsu :(Jakakolwiek alternatywa wokół tego? Inne, które tworzą nową klasę konkretną, która dziedziczy z klasy abstrakcyjnej? – bitek

+1

@MnemonicFlow Nie powinieneś tworzyć instancji w każdym razie klasa kontraktowa, tylko do użytku przez silnik Code Contracts. – piedar

Powiązane problemy