質問
C# .netでの型キャストについて知りたいのですが、以下のコード行があります。
int i=4
object o = i // This works properly without any typecasting becausing boxing takes place automatically
string s= i // This does not work, even when the string is also reference type?
string s=(string)i //This also does not work even if i try to typecast the int to string.
string s= Convert.ToString(i); // this works.
だからその理由を知りたい string s = i and string s = (string)i
機能しません、そして使用上の違いは何ですか (string)i, i.ToString(), and Convert.ToString(i)
.
解決
ボクシングとボックス化になると、タイプは明示的かつ暗黙のキャスティングを持ちます。したがって、状況によっては、ランタイムが2つのサポートされているタイプ間の暗黙の変換を可能にするのに十分な容易で、2つのサポートされているタイプ間の暗黙の変換を可能にします。ただし、整数と文字列の間に暗黙的または明示的な変換はありません。
string s = i; // attempt at implicit cast from Int32 to String, error
object o = i; // all types inherit from Object, so you may implicitly or explicitly cast from Int32 to Object.
s = (string)i; // attempt at explicit cast from Int32 to string, error
s = i.ToString(); // conversion
s = Convert.ToString(i); // conversion
.
Convert
がプレイするようになる場所です。Convert
には、既知のプリミティブ(IConvertable
をサポートするタイプ)を別のものに変換しようとするサポートが含まれています。そのため、ToString
またはConvert.ToString
は推奨されるメソッドです(ToStringとConvert.ToStringは、ToStringがいくつかのフォーマットオプションを与えることを除いて、実質的に同義です。)。
他のヒント
well、string
とobject
- どちらも参照タイプです。ただし、object
はすべての.NET型のルート型です。
(string)i
とそのような構文を使用するときは、明示的な変換勘定の種類を使用しようとしています。ただし、この変換タイプにはstring
クラスが必要なすべての引数型について知る必要があります。
では、任意のクラスでオーバーライデンスできる.ToString()
メソッドがあり、その戻り値は任意のオブジェクトの文字列表現として使用されます。
文字列s= iと文字列s=(文字列)私は機能しません
は文字列ではなく、タイプのキャストは変換されていないタイプのキャストです。文字列の文字列またはサブクラスが含まれている場合にのみ機能します(文字列が不可能ですが、他のクラスの場合は可能です)。
(String)i、i.tostring()、およびconvert.toString(i)を使用する違いはどうなっています。
(文字列)i:文字列へのキャストを割り当てる必要があります。
i.toString():System.ObjectでDefiendであるTosStringメソッドを呼び出してください。
convert.toString(i):iを文字列にcoonvertsします。これには、このまれな場合にToStringを呼び出す可能性があるコンバータを呼び出すことが含まれます。
最後に、キャスティングは微動ではありません。(文字列)iの場合は、Convertが文字列を作成しようとしている間、文字列になる必要があります。
.NETで暗黙的な変換と明示的な変換を指定することができます.S= iが失敗する理由は、文字列への整数のキャスト操作に組み込まれていないことです。
この MSDN記事さらなる情報のためのキャスティング
string s= i
型が一致しないため機能しません。int は文字列に入りません。
string s=(string)i
どの型変換が使用されるか (つまり、どのベースか) を想定できないため、機能しません。
何かのようなもの s = ""+i
一方、基数 10 の変換を想定しているため、機能します。
だからその理由を知りたい
string s = i
そしてstring s = (string)i
動作しません
簡単に言うと、int から string への暗黙的なキャスト (上記の最初の例) も明示的なキャスト (上記の 2 番目の例) も定義されていないということです。少し長い答え。構造体を作成するとき Int32
C# では、開発者が int から文字列に自動的にキャストできるようにキャスト動作がプログラムされていませんでした。
使い方の違いは何ですか
(string)i
,i.ToString()
, 、 そしてConvert.ToString(i)
そうですね、最初の方法は、あなたが言ったように、また上で説明したように機能しません。2 番目の呼び出しは、 ToString
構造体のメソッド Int32
, 、これは (名前が示すように) オブジェクトの文字列表現を返します。これはまったく新しい文字列であり、元の値とはまったく関係がないことに注意してください。3番目の例 Convert.ToString
内部では、渡されたパラメータを文字列に変換するための最も適切な方法を呼び出します。おそらく、単に ToString
方法 - 例 2 とほぼ同じです。
ToString()
メソッドは、オブジェクトクラスの仮想メソッドである各参照によってオーバーライドされます。string calss はそのメソッドをオーバーライドし、これから文字列値を提供します。
ToString メソッドの既定の実装では、次の例に示すように、オブジェクトの型の完全修飾名が返されます。
Object obj = new Object();
Console.WriteLine(obj.ToString());
// The example displays the following output:
// System.Object
この動作は、ToString メソッドをオーバーライドしない参照型によって継承されます。
C#でのTypeCastingはクラスの継承の行に沿ってのみ機能します。ObjectはC#のすべての型のルートであり、したがってすべての値はそれにタイプキャストすることができます。
string
とint
は同じ継承の分岐を共有しないため、直接キャストできないため、もう1つからもう一方にキャストできません。
Convert.ToString()
は、整数を文字列に変換するように設計されたメソッドです。これは、整数を文字列表現に変換するように設計されたメソッドを実行するだけです。
i.ToString()
は、Convert.ToString()
には、String形式の数字の表現に対する柔軟性が高いオーバーロードがあることを除いて、i.ToString()
に同等の機能を実行します。
最後の注意事項、TypeCasting規則の例外は、開発者がフィットが適合したときに1つの値を別の値に変換することを許可するpublic static explicit operator
メソッドを使用して開発者に含めることができます。
最初のものは、すべてのクラスがオブジェクトから派生することです。
オブジェクトへのintのキャスティングはINT32を使用しています。
オブジェクトへの文字列は文字列を使用しています。
クラス階層の異なる部分にあるため、整数から文字列への暗黙のキャストはありません - 1つは別の方法に関連していません。ただし、文字列は出力オブジェクト(そしてそれ故にそのすべての子)のために頻繁に使用されるので、便利なためにToString()メソッドを持ちます。
変換は、具体的にはあるタイプから別のタイプに変換できるように書面で書かれています。文字列 - もうこれは本当に便利です。の下でint32.tostring()を呼び出すだけです。