11

C# コンソール アプリケーションにfoo ( object) と foo2 ( ) があります。stringコード 2 は例外をスローしますが、コード 1 は正常に動作します。

そのように振る舞う理由を説明していただけますか (MSDN 参照付き)。

// コード 1

object foo = null;
string test = Convert.ToString(foo).Substring(0, Convert.ToString(foo).Length >= 5 ? 5 : Convert.ToString(foo).Length);

// コード 2

string foo2 = null;
string test2 = Convert.ToString(foo2).Substring(0, Convert.ToString(foo2).Length >= 5 ? 5 : Convert.ToString(foo2).Length);
4

3 に答える 3

34

のドキュメントからConvert.ToString(string):

戻り値
の型:System.String
はそのまま返されます。

したがってnull、入力はnull戻り値になります。

のドキュメントからConvert.ToString(object):

戻り値
の 型: valueSystem.String
の文字列表現、またはvalueが nullの場合。String.Empty

(ここで、「Nothing」は「null」を意味します。)

そのnullため、入力は空の文字列 (非 null 参照) の戻り値になります。

于 2012-11-22T14:05:42.740 に答える
5

なぜなら:

これは Convert.ToString(object value) の実装です

public static string ToString(Object value) {
    return ToString(value,null);
}

public static string ToString(Object value, IFormatProvider provider) { 
    IConvertible ic = value as IConvertible; 
    if (ic != null)
        return ic.ToString(provider); 
    IFormattable formattable = value as IFormattable;
    if (formattable != null)
        return formattable.ToString(null, provider);
    return value == null? String.Empty: value.ToString(); 
}

これは Convert.ToString(string value) のものです

public static String ToString(String value) {
        Contract.Ensures(Contract.Result<string>() == value);  // We were always skipping the null check here.
        return value; 
    }
于 2012-11-22T14:09:33.560 に答える
-1

このリンクから:

ここで機能する ToString の 2 つのオーバーロードがあります。

Convert.ToString(object o);
Convert.ToString(string s);

C# コンパイラは基本的に、入力で動作する最も具体的なオーバーロードを選択しようとします。null 値は、任意の参照型に変換できます。この場合、文字列はオブジェクトよりも具体的であるため、勝者として選択されます。

オブジェクトとしてのヌルでは、式の型をオブジェクトとして固めました。これは、文字列オーバーロードとの互換性がなくなったことを意味し、コンパイラは、互換性のある唯一のオブジェクト オーバーロードを選択します。

このタイ ブレークがどのように機能するかについての非常に複雑な詳細は、C# 言語仕様のセクション 7.4.3 で説明されています。

于 2012-11-22T14:07:18.250 に答える