2011-02-13 73 views
5

考慮下面的代碼:如何將代碼指定爲參數的代碼契約是Pure?

int SomeField; 
void Foo([Pure] Func<int, object> getData) 
{ 
    Contract.Requires(getData != null); 
    Contract.Requires(getData(this.SomeField) != null); 
} 

我得到以下警告:

在方法的合同

檢測調用方法 'System.Func'2<System.Int32,System.Object>.Invoke(System.Int32)' 沒有[Pure] '...... Foo(System.Func'2<System.Int32,System.Object>)'

這個警告非常有意義。但是我仍然想要在合同中調用委託,而不是發出警告(假設我的警告已變成錯誤)。我如何實現這一目標?

我嘗試了屬性Pure,如示例中所示,但這不起作用。

我也想知道爲什麼可以在參數上指定PureAttribute。如果參數的類型不是委託類型,並且即使是這樣,它也不會像我所期望的那樣工作,如上所述。

回答

1

與當前的代碼契約庫做到這一點的方法是聲明自己的委託類型,像這樣:

[Pure] 
public delegate U PureFunc<in T, out U>(T thing); 

我認爲,之所以它不委託參數的工作原理是,它會很難檢查一般:)

+0

好的,這是一個解決方案,雖然不是很優雅,因爲這需要在代碼的其他部分鑄造代表,但可以,這是可以接受的。但是,當PureAttribute被分配給一個方法或委託時,它不會被檢查純粹性,它只是假設。那麼,爲什麼我不能指定一個委託參數爲Pure? – JBSnorro 2011-02-14 11:29:09

1

我不習慣合同框架,但是從一個純粹合乎邏輯的方式來看,委託人不可能是純粹的,只是因爲它可能需要任何方法履行簽名。您無法保證適合該代表的所有方法,因爲它只需要一個合同就可以解除合同。

+0

好的。這也讓人感到驚訝。顯然不是所有代表都是純粹的。這並不意味着某些不可能,我想我應該有一種機制來指定這一點。但是,這提出了第二個問題......我將編輯我的文章。 – JBSnorro 2011-02-13 22:37:39