[解決済み] 列挙型の値に0.0を割り当てることができ、1.0を割り当てることができない理由
質問
好奇心からなのですが、なぜ列挙型の変数に0.0を代入することはできても、1.0を代入することはできないのでしょうか?次のコードを見てください。
public enum Foo
{
Bar,
Baz
}
class Program
{
static void Main()
{
Foo value1 = 0.0;
Foo value2 = 1.0; // This line does not compile
Foo value3 = 4.2; // This line does not compile
}
}
数値型と列挙値の間の変換はキャストでしかできないのでは?つまり、私はFooを書くことができます
value2 = (Foo) 1.0;
と書くと、2行目の
Main
がコンパイルできるようになります。なぜ例外が発生するかというと、値
0.0
という値で例外が発生するのはなぜでしょうか?
どのように解決するには?
0.0が使えるのはバグです。コンパイラは暗黙のうちに値0を持つ定数式をすべて0として扱ってしまいます。
さて、それは
正しい
から暗黙のうちに変換することを許可しています。
int
式からenumへの暗黙の変換を許可しています。
暗黙の列挙変換は、10進整数リテラル0を任意の列挙型とその基礎となる型が列挙型である任意のnullable型に変換することを許可しています。後者の場合、変換は基礎となるenum型に変換し、結果をラップすることによって評価されます(§4.1.10)。
私は以前この件についてC#チームと話をしたことがあります。 偶然 0.0 (および 0.0m と 0.0f) から enum 値への変換を削除したかったのですが、残念ながら、あまりにも多くのコードを壊してしまったと思います - そもそも許されるべきでなかったにもかかわらず。
Mono の
mcs
コンパイラはこれらの浮動小数点数の変換をすべて禁止しています。
は行います。
は許可します。
const int Zero = 0;
...
SomeEnum x = Zero;
にもかかわらず
Zero
は定数表現ですが
ではなく
は10進数リテラルではありません。
将来的にC#の仕様が変更され、値が0の任意の整数定数式が許されるようになっても不思議ではありません(すなわち
mcs
を模倣したもの)、しかし、浮動小数点数変換が今まで通り
公式に
が正しくなるとは思っていません。(もちろん、私は以前にも C# の未来予測について間違っていたことがありますが...)
関連
-
[解決済み】コレクションが変更され、列挙操作が実行されないことがある。
-
[解決済み】コンパイルエラー「未割り当てのローカル変数を使用しています」が発生したのはなぜですか?
-
[解決済み】C#で四捨五入する方法
-
[解決済み】SmtpException: トランスポート接続からデータを読み取れません:net_io_connectionclosed
-
[解決済み】ソケットのアドレス(プロトコル/ネットワークアドレス/ポート)は、通常1つしか使用できない?
-
[解決済み】ORA-01008: すべての変数がバインドされていません。これらはバインドされています。
-
[解決済み】HRESULTからの例外:0x800A03ECエラー
-
[解決済み] なぜList<T>を継承しないのですか?
-
[解決済み] 通貨を表すのにDoubleやFloatを使ってはいけないのですか?
-
[解決済み] なぜClangはx * 1.0を最適化し、x + 0.0を最適化しないのですか?
最新
-
nginxです。[emerg] 0.0.0.0:80 への bind() に失敗しました (98: アドレスは既に使用中です)
-
htmlページでギリシャ文字を使うには
-
ピュアhtml+cssでの要素読み込み効果
-
純粋なhtml + cssで五輪を実現するサンプルコード
-
ナビゲーションバー・ドロップダウンメニューのHTML+CSSサンプルコード
-
タイピング効果を実現するピュアhtml+css
-
htmlの選択ボックスのプレースホルダー作成に関する質問
-
html css3 伸縮しない 画像表示効果
-
トップナビゲーションバーメニュー作成用HTML+CSS
-
html+css 実装 サイバーパンク風ボタン
おすすめ
-
[解決済み】GDI+、JPEG画像をMemoryStreamに変換する際にジェネリックエラーが発生しました。
-
[解決済み】WebForms UnobtrusiveValidationModeは、jqueryのScriptResourceMappingを必要とする
-
[解決済み] 保護レベルによりアクセス不能になりました。
-
[解決済み】Socket.Selectがエラー "An operation was attempted on something that is not a socket" を返す。
-
[解決済み] EntityTypeにキーが定義されていないエラー
-
[解決済み】Visual Studio: 操作を完了できませんでした。パラメータが正しくありません
-
[解決済み】2つ(またはそれ以上)のリストを1つに統合する(C# .NETで
-
[解決済み】aspNetCore 2.2.0 - AspNetCoreModuleV2 エラー
-
[解決済み】プロセスが実行されているかどうかを知るには?
-
[解決済み】スレッド終了またはアプリケーションの要求により、I/O操作が中断されました。