2012-01-03 12 views
2

数日前に私はHow to constraint a generic to be of type enum?という質問をしました。私は、コードの契約に導入され、私は私が望むすべてが(Tがすべきことをコンパイル時に通知されるようにされ、問題のための警告コンパイル時間を作り出すことができるとされたジェネリックをenum型にするためのコードコントラクトの使用

class MyClass<T> where T : enum // Not possible in C# 
{ 
} 

:問題を要約すると次のコードでありますenumとする)。私は次のコード(Full source)を試しました。

class MyClass<T> 
{ 
    public MyClass() 
    { 
    Contract.Requires(typeof(System.Enum).IsAssignableFrom(typeof(T))); 
    } 
} 

これは、役に立たない実行時エラーを生成するだけです。私はコンパイル時の警告を生成することができますが、私はそれを動作させることはできません。誰かが私が間違っていることを教えてもらえますか?ここで

は、プロジェクトのコード契約の設定の画像です: Code Contracts Setting

+0

あなたはその質問に対する回答として提案されているライブラリを使用しましたか? – Oded

+0

@Oded、私は試しましたが、サンプルコードがないので、どこから始めるべきか分からなくなっています。これは別の質問ですが、私はこれを.NETフレームワークの一部として使っているので、これをより良い方法で実行できます。 – atoMerz

+1

@AtoMerZ:Unconstrained Melodyはライブラリとして使用するように設計されていますが、自分のコードに同じIL再書き込みを使用することができます。ちょうどコードを見てください - それはかなり簡単です。 –

答えて

1

だから、私は、ファイルに次のコードを書いた:

public class SomeClass<T> 
{ 
    [ContractInvariantMethod] 
    private void Invariants() 
    { 
     Contract.Invariant(typeof(System.Enum).IsAssignableFrom(typeof(T))); 
    } 

    /// <summary>Initializes a new instance of the SomeClass class.</summary> 
    /// <param name="dependency"></param> 
    public SomeClass() 
    { 

    } 
} 

public class SomeOtherClass 
{ 
    public SomeOtherClass() 
    { 
     var myClass = new SomeClass<int>(); 

    } 
} 

そこから、私はコードに入ったプロジェクトのセクションをコントラクト"静的検査"の下のすべてのチェックボックスをチェックしました。その後、警告レベルを「高」にしました。私が解を再構築すると、クラス不変式に対応する「コード規約:不変式は証明されていないタイプ(...)を必要とする」という警告が表示されました。

そこから、警告レベルを低く設定して、警告が表示されていないことを確認しました。だから、私は警告レベルを高く設定することがあなたが必要とするものだと思う。

これがうまくいかない場合は、私がやったことに従い、契約をクラス不変式として定義することができます(これは、あなたのコンストラクタの実行の結果)。

編集:投稿後にあなたのスクリーンショットを見ましたので、xtorからの呼び出しの代わりにクラスレベルの不変式を使用して「それが動作しない場合」の提案を使用するように提案します。

+0

ありがとうございます。それは両方の方法で働いた(前提条件と不変条件)。私はエラーが何だったのか分かりませんが、コンパイル後に警告が表示されるまでに数秒かかりましたので、私はちょっと待っていました。 – atoMerz

+1

デフォルトでは、スタティックチェックはバックグラウンドで実行されるため、コンパイルが完了した後も実行され続けます。これは、プロジェクトが大きくなったときに重要になります。なぜなら、静的解析がなければ長い時間がかかるからです。小規模なプロジェクトの場合は、「バックグラウンドでチェックイン」のチェックを外して、これをバイパスすることができます。 –

関連する問題