質問

次のコードは、次のようなコンパイル時エラーをスローします

タイプ「string」を「int」に変換できません

string name = Session["name1"].ToString();
int i = (int)name;

一方、以下のコードは正常にコンパイルおよび実行されます:

string name = Session["name1"].ToString();
int i = Convert.ToInt32(name);

知りたい:

  1. 最初のコードがコンパイル時エラーを生成する理由

  2. 2つのコードスニペットの違いは何ですか?

役に立ちましたか?

解決

(int)foo は、単に Int32 (C#では int )型へのキャストです。これはCLRに組み込まれ、 foo が数値変数(たとえば、 float long など)であることが必要です。この意味で、 Cのキャストと非常によく似ています。

Convert.ToInt32 は、一般的な変換関数として設計されています。キャストよりも多くのことを行います。つまり、 any プリミティブ型から int に変換できます(特に、 string の解析)。このメソッドのオーバーロードの完全なリストは、 MSDNで確認できます。

そして Stefan Steiger コメント内

  

また、数値レベルでは、(int)foo foo ifoo = Math.Floor(foo))を切り捨てます。一方、 Convert.ToInt32(foo)半分を偶数に丸めます(x.5を最も近いEVEN整数に丸めます。これは ifoo = Math.Round(foo)を意味します)。そのため、結果は実装上だけでなく、数値的にも同じではありません同じです。

他のヒント

(この行はマージされた質問に関するものです)(int)someString は絶対に使用しないでください-これは機能しません(コンパイラーはユーザーに許可しません)。

ただし、 int int.Parse(string)および bool int.TryParse(string、out int)(およびそれらのさまざまなオーバーロード)は公平なゲームです。

個人的に、私はリフレクションを処理しているときにのみ主に Convert を使用するため、選択は Parse およびですTryParse 。 1つ目は、値が有効な整数であると期待する場合で、そうでない場合は例外をスローすることです。 2つ目は、有効な整数であるかどうかをチェックしたい場合です。そうである場合とそうでない場合の対処方法を決定できます。

この Eric Lippertの記事

  

キャストとは、2つの矛盾することを意味します。「このオブジェクトが実際にこのタイプであるかどうかを確認し、そうでない場合はスローする」 "このオブジェクトは指定されたタイプではありません;指定されたタイプに属する同等の値を見つけてください。

つまり、1。)でやろうとしていたことは、yesがIntであると断言することです。ただし、Stringはintではないため、このアサーションは失敗します。

2。)が成功する理由は、Convert.ToInt32()が文字列を解析してintを返すためです。それでも失敗する可能性があります。例:

Convert.ToInt32("Hello");

引数の例外が発生します。

要約すると、文字列からIntへの変換はフレームワークの問題であり、.Net型システムで暗黙的なものではありません。

文字列は、明示的なキャストを介してintにキャストできません。 int.Parse を使用して変換する必要があります。

Convert.ToInt32は基本的にこのメソッドをラップします:

public static int ToInt32(string value)
{
    if (value == null)
    {
        return 0;
    }
    return int.Parse(value, CultureInfo.CurrentCulture);
}

C#キャスト操作と.NET変換ユーティリティについて説明しています

  • C#言語レベル キャスティング は括弧を使用します-例(int)-型間の暗黙的な互換性、または変換演算子
  • .NET Frameworkには多くの変換メソッドがあります。 System.Convert 変換同じまたは異なるデータ型の間。

(キャスティング)構文は、数値データ型、および「互換性」で機能します。データ型。互換性とは、継承(つまり、ベース/派生クラス)または実装(つまり、インターフェイス)によって確立された関係があるデータ型を意味します。

キャストは、変換演算子が定義されています。

System.Convert クラスは、一般的な意味で物事を変換するための多くの利用可能なメカニズムの1つです。異なる形式の既知のデータ型を、ある形式から別の形式に論理的に変更できるように変換するロジックが含まれています。

変換は、同様のデータ型間の変換を許可することにより、キャストと同じ基盤の一部をカバーします。


C#言語には独自の方法があることを思い出してください。
また、基盤となる.NET Frameworkには、プログラミング言語とは別に、独自の方法があります。
(意図的に重複する場合があります。)

より制限されたC#言語レベルの機能としてキャストし、異なる種類間で値を変換するための.NETフレームワークで利用可能な多くのメカニズムの1つとしてSystem.Convertクラスを介した変換を考えてください。

.NETには、stringからintへのデフォルトのキャストはありません。これを行うには、int.Parse()またはint.TryParse()を使用できます。または、既に行ったように、Convert.ToInt32()を使用できます。

しかし、あなたの例では、なぜToString()を実行してからそれをintに変換するのですか?単純にintをSessionに保存し、次のように取得できます。

int i = Session["name1"];

ほんの少しの追加:さまざまな状況(たとえば、double、& cをInt32に変換する場合)で、これら2つを選択する際に丸めを心配することもできます。 Convert.Int32は銀行家の丸め( MSDN )を使用します。 (int)整数に切り捨てられます。

1)C#はタイプセーフな言語であり、数字に文字列を割り当てることはできません

2)2番目のケースでは、文字列が新しい変数に解析されます。  あなたの場合、セッションがASP.NETセッションである場合、そこに文字列を保存し、取得するときにそれを元に戻す必要はありません

int iVal = 5;
Session[Name1] = 5;
int iVal1 = (int)Session[Name1];

Convert.ToInt32

    return int.Parse(value, CultureInfo.CurrentCulture);

but(int)は型キャストなので、(int)" 2"文字列をintにキャストできないため、機能しません。 Convert.ToInt32 doのように解析できます

違いは、最初のスニペットがキャストであり、2番目のスニペットが変換であることです。とはいえ、ここでの言い回しのせいで、コンパイラーのエラーがより多くの混乱をもたらしていると思います。おそらく、「型 'string'を 'int'にキャストできません」と言った方が良いでしょう。

これは古いですが、別の違いは、二重ejがある場合、(int)は数値を切り上げないことです。5.7(int)を使用した出力は5になり、Convert.ToInt()を使用すると番号は6に切り上げられます。

これについてはすでに説明しましたが、dotnetfiddleを共有したいと思います。

算術演算を処理しており、float、decimal、doubleなどを使用している場合は、Convert.ToInt32()を使用することをお勧めします。

using System;

public class Program
{
  public static void Main()
  {
    double cost = 49.501;
    Console.WriteLine(Convert.ToInt32(cost));
    Console.WriteLine((int)cost);
  }
}

出力

50
49

https://dotnetfiddle.net/m3ddDQ

ライセンス: CC-BY-SA帰属
所属していません StackOverflow
scroll top