28

コードで以前に明示的に数回指定した値の「const」を作成しました。

private static readonly int QUARTER_HOUR_COUNT = 96;

QUARTER_HOUR_COUNT に対して 96 の検索と置換を行ったときに、誤って宣言も置換してしまったため、次のようになりました。

private static readonly int QUARTER_HOUR_COUNT = QUARTER_HOUR_COUNT;

...まだコンパイルされています。私はそれがそれを許可しないと思うでしょう。有効な宣言としてコンパイラによって受け入れられたのはなぜですか?

4

5 に答える 5

23

私はそれがそれを許可しないと思うでしょう。有効な宣言としてコンパイラによって受け入れられたのはなぜですか?

おそらく、言語仕様で許可されているためです。言語仕様に、それを禁止していると思われる特定の規則がありますか?

あなたの質問が本当に「言語仕様がこれを禁止していないのはなぜですか」である場合、実際にはそのようなことをすべて禁止しながら、本当に禁止したいことだけを禁止することを確認するのはおそらく非常に難しいためだと思います。

それ自体に直接代入する単純なケースでは、言語仕様に特別なケースを用意するのは良いことですが、それでは言語が複雑になり、メリットはほとんどありません。

エラーが発生しなくても、次のような警告が表示されることを期待しています。

Test.cs(3,33): 警告 CS1717: 同じ変数に代入が行われました。別のものを割り当てるつもりでしたか?

またconst、静的な readonly 変数ではなく にすると、コンパイル時にエラーが発生することにも注意してください。

Test.cs(3,23): エラー CS0110: 'Program.QUARTER_HOUR_COUNT' の定数値の評価には循環定義が含まれます

また、.NET 命名規則により、これはQuarterHourCountSHOUTY_NAME を持つのではなく、 と呼ばれるべきであることに注意してください。

于 2012-08-15T16:27:34.657 に答える
6

コードによって生成される IL コードは次のとおりです。

 IL_0007:  ldsfld     int32 Example.Quat::QUARTER_HOUR_COUNT//Load the value of a static field on the stack
 IL_000c:  stsfld     int32 Example.Quat::QUARTER_HOUR_COUNT// Store the value from the stack in the static field

QUARTER_HOUR_COUNT のデフォルト値は 0 であるため、QUARTER_HOUR_COUNT には 0 が割り当てられます。

于 2012-08-15T17:01:55.427 に答える
5

変数が 0 として初期化されてから、それ自体に設定されたためです。

私の推測では、ゼロに初期化するそれ自体に設定する前に new Int() を実行していると思います。

于 2012-08-15T16:27:33.930 に答える
4

コンパイラはこの行を分解するため、次のようになります。

private static readonly int QUARTER_HOUR_COUNT = QUARTER_HOUR_COUNT;

基本的に次のILに相当します。

private static readonly int QUARTER_HOUR_COUNT;
QUARTER_HOUR_COUNT = QUARTER_HOUR_COUNT;

そして、明らかにそれもさらに分解されますが、上記は私のポイントを説明するのに十分なはずです。

したがって、技術的には、使用時にデフォルト値がゼロで存在します。

于 2012-08-15T16:29:33.647 に答える
0

他の人はデフォルト値を持つなどの暗黙の値型をint持っているため、明示的に初期化せずに変数を宣言すると、値がまだあることを意味します。

次のように、任意のタイプのデフォルト値を見つけることができます。

int i = default(int);

またはより一般的に:

T t = default(T);

null参照型の場合、デフォルトは になり、値型のみがデフォルト値を持つことに注意してください。

于 2012-08-15T16:58:01.430 に答える