![](http://oshiete.xgoo.jp/images/v2/pc/qa/question_title.png?e8efa67)
public SysInfoPanel()
{
Text = "System Information: Panel";
BackColor = SystemColors.Window;
ForeColor = SystemColors.WindowText;
AutoScroll = true;
Graphics grfx = CreateGraphics();
SizeF sizef = grfx.MeasureString(" ", Font);
cxCol = sizef.Width + SysInfoStrings.MaxLabelWidth(grfx, Font);
cySpace = Font.Height;
// Create a panel.
Panel panel = new Panel();
panel.Parent = this;
panel.Paint += new PaintEventHandler(PanelOnPaint);
panel.Location = Point.Empty;
panel.Size = new Size(
(int) Math.Ceiling(cxCol +
SysInfoStrings.MaxValueWidth(grfx, Font)),
(int) Math.Ceiling(cySpace * SysInfoStrings.Count)); //←この部分がエラー
grfx.Dispose();
}
エラー1次のメソッドまたはプロパティ間で呼び出しが不適切です: 'System.Math.Ceiling(decimal)' と 'System.Math.Ceiling(double)'
↑こういうエラーが出てコンパイルできません。visualstudioの2005から2013まで試しましたがだめでした。
書籍付属のコンパイル済みのexeファイルは正常に動くので何が間違っているやら
No.4ベストアンサー
- 回答日時:
ちなみに……
> doubleかdecimalかどっちかにする、
> オーバーロードという機能はそのどっちかを自動で推論してくれる機能?だと思ったのですが
> 明示的にしないとだめなのですね。
オーバーロードは「多重定義」のことです。
コンパイラは引数に応じて、複数あるオーバーロードのうちのどれを使うかを判断しますが、
候補を1つに絞りきれないと今回のようなエラーになります。
No.5
- 回答日時:
元問題は解決しているようですのでANo.2補足への回答です。
オーバーロードは、同名の関数から引数の型によりコンパイラが正しい関数を選択する機能です。
引数と完全に一致する型の関数がない場合は暗黙の型変換が行われますが、それによって選べる関数が複数になると、正しい関数を特定できないためコンパイラがエラーを出します。今回の質問の問題はこのケースです。
ポリモフィズムは実行時のオブジェクトの型によって実行する関数が変わる機能です。実行時のオブジェクトの型が特定できないということはないので実行時エラーはないですね。多重継承で実行できる関数が複数になる場合はコンパイルエラーでしょう。
No.3
- 回答日時:
> cxColはfloat型 SysInfoStrings.MaxValueWidth(grfx,Font));もfloat型を返します。
> decimalでもdoubleでもないのにエラーが出なかったのはなぜでしょう
型変換には「明示的な型変換(キャスト)」と「暗黙の型変換」とがあります。
intの場合、暗黙の型変換でdoubleにもdecimalにも直せます。
・int → double
int i = 10;
double d = i; //暗黙の型変換が可能なのでエラーにならない
・int → decimal
int i = 10;
decimal d = i; //暗黙の型変換が可能なのでエラーにならない
一方、floatは暗黙の型変換ではdoubleにしか直せません。
・float → double
float f = 10f;
double d = f; //暗黙の型変換が可能なのでエラーにならない
・float → decimal
float f = 10f;
decimal d = f; //暗黙の型変換はできないのでエラーになる
d = (decimal)f; //キャストすれば変換可能
そのため、コンパイラは「どっちを呼べばいいの?」と迷う必要はなくなります。
(この場合はMath.Ceiling(double)が呼ばれます)
参考URL:http://msdn.microsoft.com/ja-jp/library/y5b434w4 …
No.1
- 回答日時:
エラーの内容がよく分からない時は、エラーメッセージでGoogle検索等してみましょう。
(まぁこのエラーメッセージじゃ何のことかわかりにくいですよね……)
まず、Math.Ceilingメソッドですが、MSDNを見ると、
Math.Ceiling(decimal)
Math.Ceiling(double)
の2つのオーバーロードがあることが分かります。
http://msdn.microsoft.com/ja-jp/library/system.m …
cySpaceの型に関する記載がありませんが、int型の変数ですか?
cySpaceがint型とすると、
cySpace * SysInfoStrings.Count
の計算結果はint型になります。
しかし、int型の引数が使えるMath.Ceilingメソッドのオーバーロードはありません。
(int型の値にMath.Ceilingを使う意味はないので当然ですが)
なので、decimalかdoubleにキャストする必要があるわけですが、
int型はキャスト演算子なしでdecimalにもdoubleにも変換することができます。
そのため、コンパイラからすると、
「Math.Ceiling(decimal)とMath.Ceiling(double)のどっちを呼べばいいの?」
ということになります。
ということで、
Math.Ceiling((decimal)cySpace * SysInfoStrings.Count)
または、
Math.Ceiling((double)cySpace * SysInfoStrings.Count)
と書いて、どっちのMath.Ceilingを呼ぶかを指示してあげてください。
この回答への補足
ありがとうございます。キャストをしたらできました
Math.Ceiling()を使わないでコンパイルしてもできました。
intなのでMaty.Ceiling()を使う必要がない、doubleかdecimalかどっちかにする、
オーバーロードという機能はそのどっちかを自動で推論してくれる機能?だと思ったのですが
明示的にしないとだめなのですね。
一つちょっとした疑問が残るのですが、エラーとなっていた行の一つ上、
(int)Math.Ceiling(cxCol + SysInfoStrings.MaxValueWidth(grfx,Font));
の部分なのですが、cxColはfloat型 SysInfoStrings.MaxValueWidth(grfx,Font));もfloat型を返します。
decimalでもdoubleでもないのにエラーが出なかったのはなぜでしょう
お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!
このQ&Aを見た人はこんなQ&Aも見ています
関連するカテゴリからQ&Aを探す
おすすめ情報
このQ&Aを見た人がよく見るQ&A
デイリーランキングこのカテゴリの人気デイリーQ&Aランキング
-
python エラー
-
エクセルのエラーメッセージ「4...
-
適切な変換関数が存在しない???
-
Return に対応する GoSub があ...
-
sys/time.hのインクルードがで...
-
C++でConvertSidToStringSid関...
-
バッチからsqlplusの接続エラー...
-
c#プログラムについて
-
VC++ 2008 Express EditionでWi...
-
RightとLeft関数のライブ...
-
SQLServerについて
-
VB2008で定数に色の設定をした...
-
入れ子になっている構造体配列...
-
ACCESSのDate関数のエラー表示...
-
error C3867 関数呼び出しには...
-
_variant_t型のNULLチェック
-
VC++でCatchできる例外について
-
atlstr.hのインクルードによる...
-
レコードセットをcloseする所で...
-
fortranでプログラムを実行する...
マンスリーランキングこのカテゴリの人気マンスリーQ&Aランキング
-
python エラー
-
エクセルのエラーメッセージ「4...
-
Excelのエラーで困ってます。
-
適切な変換関数が存在しない???
-
fortranでプログラムを実行する...
-
バッチからsqlplusの接続エラー...
-
sys/time.hのインクルードがで...
-
デバッグ中のエラーのことで教...
-
HEWを使用しているのですが、こ...
-
コンパイルできません。
-
Handlesについて
-
RightとLeft関数のライブ...
-
visual C++ でビルドの中止がで...
-
ビルド失敗 指定されたファイ...
-
VB2008で定数に色の設定をした...
-
BC30002: 型 'ListItem' が定義...
-
ビルドが失敗してしまいます
-
multiple definitionというエラー
-
DLL関数を使ったプログラム
-
レコードセットをcloseする所で...
おすすめ情報