5

私はもう試した

 module Program
 {
  Main() : void
  { mutable x : byte = 0B;
    mutable y : byte = 0B;  
    x++;
    //y = x + 1;
    //y = x + 1B;
    //def one:byte=1;//   x = x + one;
  }
 }

どちらを試しても、次のエラー メッセージが表示されます。

エラー 1 予想されるバイト、割り当てられた値で int を取得しました: System.Int32 は System.Byte のサブタイプではありません [単純な要求]

私が見つけた唯一の方法は、

    y = ( x + 1 ):>byte

1つ追加するだけです。

どうしてこれなの?より良い方法はありますか(短い方法を読んでください)?

4

4 に答える 4

8

C# と同様に、Nemerleの abyteと aの合計の結果は anです。ただし、C# とは異なり、Nemerle はコア言語を可能な限りコンパクトに保ち、すべてのシンタックス シュガーを標準マクロ ライブラリに保持しようとします。この精神では、and演算子は通常の加算に変換されるマクロです。byteint+=++

あなたの質問に答えること(x + 1) :> byteは、それを行う方法です。コードの読者に、オーバーフローの危険性を認識して責任を負うことを知らせることができるため、実際にはすべてが悪いわけではありません。

それでも、それについて強く思うなら、キャストを実行する独自のマクロを簡単に作成でき+=ます++。数行のコードしか必要ありません。

于 2011-07-10T22:03:34.580 に答える
2

これは、CLRがAddIL命令に対して限られた数の有効なオペランドのみを定義しているためです。有効なのは、Int32、Int64、Single、およびDoubleです。IntPtrもありますが、多くの言語で無効になる傾向があります。

したがって、定数をバイトに追加するには、最初にバイトをInt32に変換する必要があります。追加の結果はInt32です。これはバイトに収まりません。より大きなハンマーを使用しない限り。それ以外の点ではこれは正常であり、Byte.MaxValueがオーバーフローする可能性はかなり高くなります。

自動的にキャストする言語があることに注意してください。VB.NETはその1つです。ただし、OverflowExceptionも自動的に生成されます。明らかに、使用しているものでも、C#でもありません。これはパフォーマンスの選択であり、オーバーフローテストはそれほど安価ではありません。

于 2011-07-10T21:33:42.190 に答える
1

免責事項:Nemerleはわかりませんが、この点ではC#と同様に動作すると思います。

より良い、より短い方法があります:バイトを使用しないでください。

そもそもなぜ使っているのですか?今日のコンピューターはそれらに最適化されているため、ほとんどの場合、sを使用した計算はintsを使用した計算よりも高速です。byte

于 2011-07-10T21:06:06.853 に答える
0

これが型システムの機能です。アップグレード値を int に追加してから、int になる操作を実行します。また、開始値が 255 の場合はどうなるか考えましたか?

于 2011-07-10T21:09:18.660 に答える