4

私はPByteというクラスで作業しています。これは、32から126までのint値を表す必要があります。(PByte = Printable Byte)ここで、クラスのユーザーがオブジェクトを誤って初期化するのを防ぎたいのですが、必要ありません。例外をスローするには、これを実行しようとしたときに発生するように、VisualStudioがコンパイルされないようにします。byte b = 256;

sealed class PByte : IEquatable<PByte>, IComparable, IComparable<PByte>
{
    public PByte(int value)
    {
        /* if (value < 32 || value > 126)
            throw new ArgumentException("\"" + value + "\" is not a valid PByte-value"); */ 
        this._value = value;
    }

[...]

私もこれを実装しました:

[...] 

    public static implicit operator PByte(int value)
    {
    /*  if (value < 32 || value > 126)
            throw new ArgumentException("\"" + value + "\" is not a valid PByte-value"); */
        return new PByte(value);
    }
}

したがって、これも不可能なはずです。 PByte p = 2000;

4

2 に答える 2

5

コードコントラクトを使用せずに、コンパイル時にそれを強制することはできません。それでも、コードコントラクトは警告を生成するだけであり、一般的には問題の所有権を呼び出し元のスコープに置くと思います。

于 2012-08-07T18:20:18.497 に答える
1

これは主に、コードコントラクトをエディター拡張機能(拡張機能ギャラリーで利用可能)と組み合わせて使用​​して行うことができます。しかし、それがすべての状況を完全に強制するかどうかはわかりません。Code Contracts(編集:プロジェクトのプロパティのセクションで静的チェックをオンにします。)

したがって、大まかに言うと、次のようなことができます。

public PByte(int value)
{
    Contract.Requires<ArgumentException>(value >= 32 && value <= 126, "\"" + value + "\" is not a valid PByte-value");
    this._value = value;
}
于 2012-08-07T18:26:30.400 に答える