Convert.ChangeTypeがオブジェクトパラメーターを取得するのはなぜですか?
-
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;
}
所属していません StackOverflow