2012-03-15 8 views
8

以下の最初のコードブロックに示すように、C#の引数のuintパラメータにデフォルト値を代入すると、「int型の値はデフォルトパラメータとして使用できません」というメッセージが表示されます'uint'型に変換する標準的な変換はありません。一方、メソッド本体のuint変数にintを代入すると問題ありません。C#の引数のuintパラメータに整数値を代入するのはなぜ無効ですか?

コードはコンパイルされます。警告は、このように、365の代わりに365Uを使用することによりにより、2010年

void GetHistoricData(uint historyLength = 365) 
{ 
    uint i = 365; // this is valid 
} 

これは簡単に解決される波線のVisual Studioで下線、赤の手段によって提供されています。私はそれを見つけています

void GetHistoricData(uint historyLength = 365U) 
{ 
    // method body 
} 

他の場所で有効な場合には、intをパラメータのuintに割り当てることがなぜ無効であるかの説明を見つけることは本当に困難です。誰かが私が見つけようとしている「電球」の瞬間を助けてくれる?

+1

赤い下線は、コンパイルできないことを意味します。あなたはVSを再起動しようとしましたか? – Tsabo

+1

私はそれがあなたのセットアップに固有のものだと信じています。私のコードには警告が "赤くて不思議な下線"で表示されません。 –

+0

ビジュアルスタジオの再起動により、ReSharperは、アンダーラインがハイライト表示されたときに、そのライトバルブを左に表示し、ReSharperの警告の1つに過ぎないことを示しました。 – Jason

答えて

1

4.0.30319.1と4.0.30319.17379の両方のコンパイラバージョンでコンパイルできます。

古いバージョンや別のコンパイラ(たとえばMonoなど)を使用している場合は、単なるバグだと思われます。

EDIT:コンパイルがうまくいけば(コンパイラから警告が出ない)、と思われます。 ReSharperなどのプラグインです。 (ReSharperでも見ていないのですが...)

私はこれをVS2010で再現できません。

私はあなただけの読みやすさのために、更新警告なし1へのコードを実行しますことを示唆している - しかし、それは有効コード変更なしに、まだです。

+0

それは私にも合っています。私はそれを言及すべきだったので、私は質問を更新するでしょう。この警告は、ビルドエラーではなく、VS2010の赤い波線のメッセージです。 – Jason

+1

これは、オプションのパラメータが動作する方法が原因である可能性があります。実際には、getメソッドが呼び出しメソッドに注入されているということです。コンパイラは警告を出さずに行うのは良い考えではないと考えています。 – ntziolis

+0

結局、ReSharperのプロンプト。 VSの再始動の後、R#の電球は、今、(時には)squigglyラインがマウスオーバーされたときに現れ始めました。 – Jason

1

あなたはキャストを作り、その可能性も値を切り捨てていることを考えると、私はを推定、Visual Studioの唯一は、潜在的な問題の事実についてあなたが起こる可能性を警告し、そのキャストesplicitを作るためにを誘います。特に、デフォルトのパラメータについては、デフォルト値を明確に指定する必要があります。代わりに非脱出的なキャストの場合には、キャスティング・バリューがどのようなものになるのか、常に疑問の余地があります。

1

赤い下線は通常、コンパイルできないことを意味します。 VS上のコードアナライザは時々バグアウトして、誤ったエラーメッセージと警告を生成しますが、それはまだコンパイルされます。通常の再起動はそれらを取り除く。

関連する問題