2015-10-27 10 views
7

私はC#でMicrosoftのコード契約拡張を使用しています。私はnullを返しますオーバーライドされたToStringメソッドの実装を持つクラスを書くとき、それは正確に問題を識別します。コードコントラクトはToStringオーバーライドがnullを返さないことをどのように知っていますか?

CodeContracts string cannot be null

私は、Microsoftが内部でコードコントラクトを使用しているため、このだったと仮定し、彼らはObject.ToStringContract.Ensuresコールを追加しました。しかし、私がObject.ToString source codeを見ると、私は契約を見ません(私は他の契約を見ていますが、私が探しているものはありません)。 ToStringがnullを返すべきではないとCode Contractsが判断する方法は?

答えて

6

これはコード契約の内部定義System.Object(link)です。あなたが見ることができるように、彼らはこの制約を持つToString()を定義した:

Contract.Ensures(Contract.Result<string>() != null); 

あなたの質問に答えるために、コードの契約は、それが原因で内部契約の定義のヌルではありません知っています。

+0

さらに詳しい情報を提供する:コードコントラクトは公式のアセンブリに含まれていないため、referencesource.microsoft.comには表示されません。コード契約チームは、すべてのコード契約を自分自身で定義し、実際のソースではなく契約のみを含む個別の契約参照アセンブリに提供します。 – cremor

+0

@remoありがとう!ちょうど、私はReferenceSource(例えば[Object.cs](http://referencesource.microsoft.com/#mscorlib/system/object.cs,180))で多くの契約を見ていますが、誰がそれを書いたかに応じて、.NETコアまたはコード契約で指定することができます。 – Will

関連する問題