C# と VB.NET の質問掲示板

ASP.NET、C++/CLI、Java 何でもどうぞ

C# と VB.NET の入門サイト

(string)とToString()の違い

[トピック内 4 記事 (1 - 4 表示)]  << 0 >>

■89840 / inTopicNo.1)  (string)とToString()の違い
  
□投稿者/ HM (1回)-(2019/01/08(Tue) 04:49:55)

分類:[C#] 

開発環境は、
Windows10, Visual Studio Community2017を使用しています。

(string)とToString()の違いは何でしょうか?

下記のように、double型を(string)を使ってstring型にキャストしようとしましたが、
「string型をdouble型に変換できません。」という主旨のエラーが出ました。

そこでToString()を使ってみたら、エラーが出なくなりました。
なぜ(string)だとエラーが出て、ToString()だとエラーが出ないのでしょうか?

WindowsフォームアプリケーションのForm1.csを編集したコード:
using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using System.Windows.Forms;

namespace TaxCalc
{
    public partial class Form1 : Form
    {
        public Form1()
        {
            InitializeComponent();
        }

        private void CalcButtonClicked(object sender, EventArgs e)
        {
            int taxExcluded;
            bool success = int.TryParse(this.taxExcludedTextBox.Text, out taxExcluded);

            if (success)
            {
                double taxIncluded = (double)taxExcluded * 1.08;
                this.taxIncludedTextBox.Text = (string)taxIncluded;
            }
        }
    }
}

引用返信 編集キー/
■89841 / inTopicNo.2)  Re[1]: (string)とToString()の違い
□投稿者/ 774RR (655回)-(2019/01/08(Tue) 08:29:44)
「なぜ」と問われると「仕様だから」ってことになるわけですが
https://docs.microsoft.com/ja-jp/dotnet/csharp/programming-guide/types/casting-and-type-conversions
https://docs.microsoft.com/ja-jp/dotnet/csharp/language-reference/keywords/explicit-numeric-conversions-table
double を文字列にする明示的変換すなわちキャストは後者の一覧の中にない、よって許されていない。
なので ToString() が必要ってことでしょう。

浮動小数点数の文字列化にはいろんな方式があるので変換方法=フォーマットを指定する必要があり
単にキャストだとフォーマット指定ができないのでダメ、って事情もありそう。

double x = 0.1; // は正確に 0.1 にならない
Console.WriteLine(x.ToString());
Console.WriteLine(x.ToString("E17"));
Console.WriteLine(x.ToString("F17"));
Console.WriteLine(x.ToString("G17"));
だと
0.1
1.00000000000000010E-001
0.10000000000000000
0.10000000000000001
のように変換方式によって文字列化の結果が違います、ってことで。

引用返信 編集キー/
■89855 / inTopicNo.3)  Re[2]: (string)とToString()の違い
□投稿者/ HM (2回)-(2019/01/08(Tue) 22:46:42)
ありがとうございます。
納得致しました。
解決済み
引用返信 編集キー/
■89868 / inTopicNo.4)  Re[2]: (string)とToString()の違い
□投稿者/ 通りすがり (7回)-(2019/01/11(Fri) 07:02:35)
No89841 (774RR さん) に返信

> double を文字列にする明示的変換すなわち*キャスト*は後者の一覧の中にない、よって許されていない。

理解されているとは思いますが、この説明(キャストと呼ぶことそのもの)だと誤って理解しそうに思います。

まったく別ものとして、

キャスト:互換性のある型へ変換するもの。(異常時の挙動が異なる)as による型変換も同類。
ToString():値の文字列表現を得るもの。<型>.Parse(文字列)、<型>.TryParse(文字列)が逆の操作

などと説明する方が良いのではないでしょうか。

解決済み
引用返信 編集キー/

このトピックをツリーで一括表示


トピック内ページ移動 / << 0 >>

このトピックに書きこむ