質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

新規登録して質問してみよう
ただいま回答率
85.48%
VB.NET

Microsoft Visual Basic .NETのことで、Microsoft Visual Basic(VB6)の後継。 .NET環境向けのプログラムを開発することができます。 現在のVB.NETでは、.NET Frameworkを利用して開発を行うことが可能です。

Q&A

解決済

2回答

4637閲覧

VB.NET で decimal から double に型変換した時に"キャストが冗長です。"と警告がでる理由を知りたい。

zakonokiwami

総合スコア5

VB.NET

Microsoft Visual Basic .NETのことで、Microsoft Visual Basic(VB6)の後継。 .NET環境向けのプログラムを開発することができます。 現在のVB.NETでは、.NET Frameworkを利用して開発を行うことが可能です。

0グッド

0クリップ

投稿2020/08/07 07:01

編集2020/08/07 08:35

VB.NET

1 Dim abc As Decimal = 1111.1111111111111 2 Dim def As Double = CType(abc, Double)

decimal 型から double 型へキャストした時に
CType にマウスポイントすると "キャストが冗長です。"とメッセージがでますが、
何故でしょうか。

この質問させて頂いた理由といたしまして、C# のコードを VB.NET に手動で変換しているのですが(勉強も兼ねて)その際にC#での以下のコードを VB.NET に変換したところ今回の疑問に直面しました。

C#

1decimal abc = 1111.1111111111111M; 2double def = (double)abc;

「C# ではキャストが必要で VB.NET でいらない」というのは言語の違いということで間違いないのでしょうか。

初歩的な質問となりますが宜しくお願い致します。

気になる質問をクリップする

クリップした質問は、後からいつでもMYページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

Zuishin

2020/08/07 07:26

そんな警告は出ませんが、abc は Decimal ではなく Double なのではありませんか?
Zuishin

2020/08/07 07:28

間違いです。ビルドしてもエラー一覧には出ませんが、マウスでポイントすると表示されました。
zakonokiwami

2020/08/07 07:33

ご返信頂き、誠にありがとうございます。 上記コードは正しいです。質問方法に問題がありました。 >"キャストが冗長です。"と警告がでますが、何故でしょうか。 この上記は警告ではなく Ctype にカーソルをもっていくと "キャストが冗長です。" と メッセージ(エラー?正式名がわかりません。)がでます。これは decimal から double 型 へのキャストなので無駄ではないと思っています。理解が間違っているのでしょうか。
Zuishin

2020/08/07 07:44

すみません、誤解を招きました。間違いと書いたのは、私の書いたことが間違いということです。 https://docs.microsoft.com/ja-jp/dotnet/visual-basic/programming-guide/language-features/data-types/widening-and-narrowing-conversions ここを見ると、Decimal から Double への変換は拡大変換になるので、CType は不要です。そのため、ポイントするとリファクタリングのためのヒントが表示されます。 このような時には、その部分にキャレットを置いて Ctrl+. (コントロールキーとドットを同時に押す)で修正できます。 ただ、こちらで試してみたところ、Double から Decimal への変換は縮小変換にあたるにも関わらず、Double から Decimal への変換でも明示的なキャストが不要ということになってしまいます。私の理解が間違っているのかもしれませんが、もしかするとバグかドキュメントが間違っている可能性もあります。
zakonokiwami

2020/08/07 08:17

丁寧なご返信ありがとうございます。 バグかドキュメントが間違っている可能性があるとの旨、わかりました。 また本件を質問させて頂いた理由といたしまして、C# のコードを VB.NET に手動で変換しているのですが(勉強も兼ねて)その際にC#での以下のコードをVB.NET に変換したところ今回の疑問に直面しました。 ```C# decimal abc = 1111.1111111111111M; double def = (double)abc; ``` C#ではキャストが必要でVB.NETでいらない。というのは言語の違いということで間違いないのでしょうか。質問が派生してしまい申し訳ないです。。。
zakonokiwami

2020/08/07 08:33

ご返信頂き、ありがとうございます。 質問内容について、お陰様で解消いたしました。 今後とも宜しくお願い致します。 また、Zuishin さんにベストアンサーを送りたいのですが、今回の質問に対して回答を頂けないでしょうか。質問に対しての返信のようでベストアンサーを選択できません。お手数ですが宜しくお願い致します。
Zuishin

2020/08/07 08:46

いえ、VB.NET でなぜ双方向の暗黙的キャストができるのかというところが未解決なので、識者の回答を待つ方がいいと思います。 まだ質問したばかりなので、十分人の目に触れていません。
zakonokiwami

2020/08/07 08:48

ご返信内容について承知いたしました。 丁寧な回答誠にありがとうございました。
guest

回答2

0

ベストアンサー

キャストが冗長です、は警告ではなく修正しなくても特に問題はないが、簡略化した記述が出来るというヒントですね。
警告は、コンパイルする上では問題はないが、初期化しない変数を使用したり、推奨されていないメソッドを使用したり等問題を引き起こす可能性があるコードで発生します。
エラーは、明確にコンパイルエラーになるコードです。

「C# ではキャストが必要で VB.NET でいらない」というのは言語の違いということで間違いないのでしょうか。

これは、コンパイルオプションの設定によります。

vbnet

1 Dim abc As Decimal = 1111.1111111111111

上記コードは、Option Strict Offにしていると、キャストを行わなくても遅延バインディングで型を解決するためコンパイルは通りますが、Option Strict Onにすると遅延バインディングは許可されないため、Decimal型変数にDouble型の数値リテラルを代入しようとしているこのコードはコンパイルエラーになります。

vbnet

1 Dim abc As Decimal = 1111.1111111111111D

こう記述すればOKです。
Type characters (Visual Basic)

遅延バインディングは想定外の不具合の原因になりやすいので、Option Strict Onにする事を推奨します。環境設定を行っていない場合、VB.NETのデフォルトのプロジェクト設定だと、Option Strict Offになります。

投稿2020/08/07 09:55

編集2020/08/07 10:11
退会済みユーザー

退会済みユーザー

総合スコア0

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

sazi

2020/08/07 10:49

試しての回答ではないのですが、 > CType にマウスポイントすると "キャストが冗長です。"とメッセージが という事なのでキャストの警告だと思ったのですが、 > 簡略化した記述が出来るというヒントですね。 なのですか?
退会済みユーザー

退会済みユーザー

2020/08/07 10:54

警告・エラーの場合は、エラー一覧のリストにコード番号付きで表示されます。
sazi

2020/08/07 11:02 編集

ああ、失礼しました。 ヒントという表現でも良いのですが、回答された内容が、質問のcast部分についてどう関係しているか分からなくてコメントしました。
Zuishin

2020/08/07 11:09

Visual Studio の機能ですが、Decimal の値を Double の変数に代入する時に CType を使っていると、そこをマウスでポイントした時に「キャストが冗長です」というメッセージが表示されます。暗黙の変換ができる時に明示的なキャストを使うと出るメッセージのようです。 うちでは逆に Double の値を Decimal の変数に代入する時にも同じメッセージが表示されましたが、こちらの回答を参考に Option Strict On にするとそちらは出なくなりました。
Zuishin

2020/08/07 11:13

Option Strict Off の時にはドキュメントの記述と食い違いがあって謎だったんですが、On によって一致したので、この回答を高評価しました。
sazi

2020/08/07 11:19

@Zuishinさん 質問の内容も編集されていて、論点がずれてしまったのかと混乱していました。 ありがとうございました。
guest

0

浮動小数点付き数値への特定の数値型からの変換で精度が損なわれる可能性があります。

.NET の型変換の表

何故誤差が生じるかは以下を参考に
小数(浮動小数点数型)の計算が思った結果にならない理由と解決法
Decimal型はいつ使うか?

投稿2020/08/07 07:23

編集2020/08/07 07:32
sazi

総合スコア25173

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
85.48%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問