1

私は理解できない問題に直面しています。

クラス内とクラスpublic void Method1(object obj)内の2 つのメソッドがあるとします。ViewModelpublic void Method2(object obj)Model

Method2Method1クラスのインスタンスを使用して呼び出されますModel(たとえば、objMはクラスのオブジェクトであり、ModelクラスのメンバーですViewModel)。

class ViewModel
{
public void Methods1(object obj)
{
     if (!(
                        (      (false == this.HasSal)
                            && (typeof(Class1) == obj.GetType())
                          )
                    ||
                        (      (true == this.HasSal)
                            && (typeof(Class2) == obj.GetType())
                        )
                   ) 
                )
            {
                throw new ArgumentException("invalid obj");
            }
            Contract.EndContractBlock();
            objM.Method2(obj);
            .....
} 
}

class Model
{
public void Method2(object obj)
{
 Contract.Requires(
                    (      (false == this.HasSal)
                        && (typeof(Class1) == obj.GetType())
                    )
                ||
                    (      (true == this.HasSal)
                        && (typeof(Class2) == obj.GetType())
                    )

            );
    .....
    }
}

コードをビルドしようとするたびに、Visual Studio は次の警告を生成します。

Code contracts: Requires unproven
(
                    (      (false == this.HasSal)
                        && (typeof(Class1) == obj.GetType())
                    )
                ||
                    (      (true == this.HasSal)
                        && (typeof(Class2) == obj.GetType())
                    )

            )

提案してください。

4

2 に答える 2

0

の型は実行時までわからないため、静的チェッカーがコントラクトを検証できるとは思いません。タイプorのオブジェクト のみが に渡されるobjという保証はありません。Class1Class2Method1

を呼び出すメソッドに追加のコントラクトを追加することで、これを証明できる場合がありますMethod1。そのコードを含めていただければ、静的チェッカーを満たす方法を提案できるかもしれません。

編集: 実は、別の問題もあります。HasSalが public-setter プロパティの場合、コントラクトを検証できるかどうかわかりません。別のスレッドが呼び出されてからメソッド本体が実行されるHasSalまでの間に の値を変更できる可能性が常にあります。Method1

于 2013-01-23T13:15:18.753 に答える