Convert.ChangeTypeがオブジェクトパラメーターを取得するのはなぜですか?

StackOverflow https://stackoverflow.com/questions/3847997

  •  27-09-2019
  •  | 
  •  

質問

Convert .NET 1.0以来、クラスが存在しています。 IConvertible インターフェイスも今回から存在しています。

Convert.ChangeType 方法 それだけ 実装するタイプのオブジェクトで動作します IConvertible (実際、私が間違っていない限り、 すべて によって提供される変換方法の Convert クラスはこのようにです)。では、なぜパラメータータイプがあるのか object?

言い換えれば、これではなく:

public object ChangeType(object value, Type conversionType);

なぜ署名はこれではないのですか?

public object ChangeType(IConvertible value, Type conversionType);

私には奇妙に思えます。

役に立ちましたか?

解決

リフレクターを見ると、あなたは上部を見ることができます ChangeType(object, Type, IFormatProvider), 、これはカバーの下で呼ばれるものです。

public static object ChangeType(object value, Type conversionType, IFormatProvider provider)
{
  //a few null checks...
  IConvertible convertible = value as IConvertible;
  if (convertible == null)
  {
    if (value.GetType() != conversionType)
    {
        throw new InvalidCastException(Environment.GetResourceString("InvalidCast_IConvertible"));
    }
    return value;
  }

だから、それはタイプのオブジェクトのように見えます そうではありません 埋め込む IConvertible しかし、すでに 宛先タイプは、元のオブジェクトを返すだけです。

確かに、これはそうです それだけ 実装する必要がある価値の例外 IConvertible, 、しかし、それは例外であり、パラメーターがそうである理由のように見えます object 代わりは。


このケースのクイックLinqPadテストは次のとおりです。

void Main()
{
  var t = new Test();
  var u = Convert.ChangeType(t, typeof(Test));
  (u is IConvertible).Dump();   //false, for demonstration only
  u.Dump();                     //dump of a value Test object
}

public class Test {
  public string Bob;
}
ライセンス: CC-BY-SA帰属
所属していません StackOverflow
scroll top