1

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)

4

9 に答える 9

3

ボクシングとアンボクシングに関しては、型には明示的および暗黙的なキャストがあります。したがって、状況によっては、ランタイムが2つのサポートされているタイプ(たとえば、Int32からDouble)間の暗黙的な変換を可能にするのは簡単です。ただし、明らかに文字列は整数ではないため、整数と文字列の間に暗黙的または明示的な変換はありません(文字列には整数の文字を含めることができるという事実にもかかわらず)。

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がいくつかのフォーマットオプションを提供することを除いて、実質的に同義です)。

于 2012-02-27T10:06:20.380 に答える
0

C#での型キャストは、クラス継承の方針に沿ってのみ機能します。オブジェクトはC#のすべての型のルートであるため、すべての値をオブジェクトに型キャストできます。

stringまたint、継承の同じブランチを共有しないため、一方から他方に直接キャストすることはできません。

Convert.ToString()は整数を文字列に変換するように設計されたメソッドです。型キャストは行われず、整数を文字列表現に変換するように設計されたメソッドを実行するだけです。

i.ToString()文字列形式での数値の表現に大きな柔軟性を与えるオーバーロードがあることをConvert.ToString()除いて、と同等の機能を実行します。i.ToString()

最後に、型キャスト規則の例外は、開発者が適切と思われるpublic static explicit operator値を別の値に変換できる方法を使用して、開発者が含めることができます。

于 2012-02-27T10:10:10.957 に答える
0

だから私は理由を知りたいのですがstring s = i機能string s = (string)iしません

簡単な答えは、intから定義された文字列への暗黙的(上記の最初の例)または明示的(上記の2番目の例)のキャストはないということです。少し長い答え。C#で構造体を作成する場合Int32、開発者がintから文字列に自動的にキャストできるようにキャスト動作はプログラムされていません。

(string)i、、i.ToString()およびを使用する場合の違いは何ですかConvert.ToString(i)

さて、あなたが言ったように、そして上記で説明したように、最初のものは機能しません。ToString2つ目は、structのメソッドを呼び出します。このメソッドは、 Int32(名前が示すように)オブジェクトの文字列表現を返します。これはまったく新しい文字列であり、元の値とはまったく関係がないことに注意してください。3番目の例Convert.ToStringでは、内部的に、渡されたパラメーターを文字列に変換するための最も適切な方法を呼び出します。ほとんどの場合、ToStringメソッドを呼び出すだけです。例2とほとんど同じです。

于 2012-02-27T10:05:48.803 に答える
0

最初に注意することは、すべてのクラスがオブジェクトから派生しているということです。

intをオブジェクトにキャストするには、Int32を使用します。

文字列をオブジェクトにキャストするには、文字列を使用します。

整数から文字列への暗黙のキャストはありません。これは、それらがクラス階層の異なる部分にあるためです。あるものは別の部分とはまったく関係がありません。ただし、文字列は出力オブジェクト(したがってそのすべての子)に頻繁に使用されるため、便宜上ToString()メソッドがあります。

ただし、Convertは、あるタイプから別のタイプに変換できるように特別に記述されています。たとえば、Convert.ToBool(x)は、「true」または「false」をブール値に解析でき、示したように、整数を文字列に変換できます。繰り返しになりますが、これは本当に便利で、おそらく内部でInt32.ToString()を呼び出すだけです。

于 2012-02-27T10:08:59.617 に答える
0

ToString()メソッドは、オブジェクトクラスの仮想メソッドである各参照によってオーバーライドされます。string calssはそのメソッドをオーバーライドし、これから文字列値を提供します。

ToStringメソッドのデフォルトの実装は、次の例に示すように、オブジェクトのタイプの完全修飾名を返します。

 Object obj = new Object();
      Console.WriteLine(obj.ToString());

// The example displays the following output:
//      System.Object

この動作は、ToStringメソッドをオーバーライドしない参照型によって継承されます。

于 2012-02-27T10:00:11.880 に答える
0

ええと、stringそしてobject-どちらも参照型です。ただし、objectはすべての.NETタイプのルートタイプです。

のような構文を使用する場合(string)i、型間で明示的な変換を使用しようとしています。ただし、この変換タイプでは、stringクラスがすべての可能な引数タイプについて知っている必要があります。

したがって.ToString()、任意のクラスでオーバーライドできるメソッドがあり、その戻り値は任意のオブジェクトの文字列表現として使用されます。

于 2012-02-27T10:03:24.813 に答える
0

string s=iおよびstrings=(string)iは機能しません

私は文字列ではなく、型CASTINGは型のCASTであり、変換ではないためです。これは、iに文字列または文字列のサブクラスが含まれている場合にのみ機能します(これは文字列では不可能ですが、他のクラスでは可能です)。

(string)i、i.ToString()、およびConvert.ToString(i)の使用の違いは何ですか。

  • (文字列)i:iを文字列にキャストします。割り当て可能である必要があります。

  • i.ToString():ToSstringメソッドを呼び出します。これは、System.objectで定義されているため、すべてのクラスと構造体で使用できますが、上書きされない限り、適切なコンテンツは返されません。

  • Convert.ToString(i):iを文字列に変換します。これには、このまれなケースでToStringを呼び出す可能性が高いコンバーターの呼び出しが含まれます。

最後に、キャスティングは変換ではありません。for(string)i to work i HAS TO BE A STRING、一方、convertはそれを文字列にしようとします。

于 2012-02-27T10:03:49.680 に答える
0

.netで暗黙的および明示的な変換を指定できます。文字列s=iが失敗する理由は、整数から文字列への組み込みのキャスト操作がないためです。

詳細については、キャストに関するこのMSDNの記事を参照してください。

于 2012-02-27T10:03:53.963 に答える
0

string s= iタイプが一致しないために機能しません。intは文字列に入りません。

string s=(string)iどの型変換が使用されるか(つまり、どのベース)を想定できないため、機能しません

s = ""+i一方、10進数の変換を想定しているため、の ようなものが機能します。

于 2012-02-27T10:05:02.937 に答える