4

私は、32から126までの整数値を表すことができ、「PByte」(Printable Byteの略)と呼ばれるタイプを含むdllに取り組んでいます。問題は、たとえば1000で型を初期化することからユーザーを保護したいということです。これは、例外をスローするべきではありません。Visiual Studioがたとえば256でバイトを初期化しようとするように、コンパイルを防ぐ必要があります。型はコンストラクターで初期化されます。

public PByte(int value)
{
    /* if (value < 32 || value > 126)
        throw new ArgumentException("\"" + value + "\" is an invalid value!"); */
    this._value = value;
}

これ

PByte pb = new PByte(2000);

コンパイル可能であってはなりません。

4

2 に答える 2

5

コンパイル時にランタイム例外を発生させたいですか?それ無理!

PByte pb = new PByte(get399());コンパイルする必要がありますか?get399()いいえ、しかし、プログラムを実行せずに何をするのかをどうやって知ることができますか?

ただし、まず、パラメータをbyte型にする必要があります。これにより、0〜255以外の数値のコンパイル時例外が発生します。

于 2012-08-07T21:55:32.573 に答える
2

あなたが持っている唯一のオプションは、範囲外のときにヌル文字を割り当てることです。このようなもの。

public struct PByte : IEquatable<PByte>
{
    readonly byte _value;
    public PByte(byte value)
    {
        this._value = (byte)( value > 31 && value < 128 ? value : 0);
    }
    public byte Value { get { return this._value; } }
    public char Char { get { return (char)_value; } }
    public bool Equals(PByte other)
    {
        return _value.Equals(other._value);
    }        
}

class Program
{
    static void Main(string[] args)
    {
        var p1 = new PByte(1000); // Won't compile
        var p2 = new PByte(5);      //'\0'
        var p3 = new PByte(65);     //'A'
        var p4 = new PByte(125);    //'}'
        var p5 = new PByte(175);    //'\0'
    }
}
于 2012-08-12T00:07:27.060 に答える