Code ContractsとCode Contracts Editor Extensions VS2010アドインを使用しています。私はIEnumerable<T>
インターフェイスを実装するクラスを持っており、GetEnumerator()
メソッドのイテレータブロックを実装しました。 GetEnumerator()
がnullを返してはいけません、それは副作用を引き起こすことはありませんしなければならない - コード契約:IEnumerator <T> .GetEnumerator()weirdは契約を継承していますか?
Model
のプロパティは
IEnumerator<T>
と
IEnumerable
ですか?
EDIT:Damien_The_Unbelieverは彼のコメントで指摘したように、IEnumerable<T>
とIEnumerator<T>
のための契約は別々のファイル、契約リファレンスアセンブリに配置されています。エディタで表示されていないGetEnumerator()
に追加の契約があります、興味深いことに
[return: Fresh]
[Escapes(true, false), Pure, GlobalAccess(false)]
public IEnumerator GetEnumerator()
{
IEnumerator enumerator;
Contract.Ensures((bool) (Contract.Result<IEnumerator>() != null), null, "Contract.Result<IEnumerator>() != null");
Contract.Ensures((bool) (Contract.Result<IEnumerator>().Model == this.Model), null, "Contract.Result<IEnumerator>().Model == this.Model");
Contract.Ensures((bool) (Contract.Result<IEnumerator>().CurrentIndex == -1), null, "Contract.Result<IEnumerator>().CurrentIndex == -1");
return enumerator;
}
:(フルコードはhereである)これらの二つのインターフェースの契約の解体で、Reflectorを使用して、以下を参照してくださいすることができます拡張子:
Contract.Result<IEnumerator>().CurrentIndex == -1
と(例えばFresh
、Escapes
とGlobalAccess
属性など)いくつかのadditionaly謎。
私はあなたを助けることはできませんが、興味のある分野に向けて私を指摘してくれてありがとう。コードコントラクトで使用される 'IEnumerable'と' IEnumerable'と 'IEnumerable 'タイプは、C:¥Program Files¥Microsoft¥Contracts¥Contracts¥.NETFramework¥v4.0¥mscorlib.Contracts.dll(場所は異なる場合があります)からロードされます。これらのバージョンインタフェース(および関連するコントラクトクラス)には、mscorlibの「実際の」インタフェースより多くのメンバがあります。しかし、契約の注釈を読んでも、私はモデルの目的が何であるか分かりません。 –
@Damien:ありがとう、私は新しい情報ごとに質問を編集しました。 –
その 'IEnumerator'は、実際の' IEnumerator'インタフェースや同じ名前のクラスの型を返しますか?それがインタフェースであれば、なぜそれがコンパイルされるのか理解できません。 – CodesInChaos