C# Convert.ChangeType是否为快捷方式?

C# Convert.ChangeType是否为快捷方式?,c#,.net,C#,.net,我想知道当对象的类型与类型匹配时,Object Convert.ChangeType对象、Type类型内部会发生什么。它只是捷径和返回对象吗 例如: object objString = "Hello World"; string converted = (string) Convert.ChangeType( objString, typeof ( String ) ); ChangeType的实现实际上是调用IConvertible接口还是只返回objString?是的,它将调用对象上的

我想知道当对象的类型与类型匹配时,Object Convert.ChangeType对象、Type类型内部会发生什么。它只是捷径和返回对象吗

例如:

object objString = "Hello World";

string converted = (string) Convert.ChangeType( objString, typeof ( String ) );

ChangeType的实现实际上是调用IConvertible接口还是只返回objString?

是的,它将调用对象上的IConvertible接口。 对于string,它将调用objString.ToString,而objString.ToString又会返回这个字符串

此外,如果对象的类型没有实现IConvertible,并且您转换为相同的类型,那么它将只返回相同的对象


如果类型未实现IConvertible,并且您转换为其他类型,则将引发异常。

是,它将调用对象上的IConvertible接口。 对于string,它将调用objString.ToString,而objString.ToString又会返回这个字符串

此外,如果对象的类型没有实现IConvertible,并且您转换为相同的类型,那么它将只返回相同的对象

若类型未实现IConvertible,而您转换为其他类型,则会引发异常。

可能会对您有所帮助

如果类实现了IConvertable接口,则可以使用 System.Convert.ChangeType更改数据类型:

把ChangeType看作VB中一个大的switch语句select case… 有很多重载函数。类似于以下免责声明: 这是一个伪代码,而不是.NET的 实施:

声明实现IConvertible接口的类必须实现 上述交换机结构中的所有转换加上GetTypeCode:

·GetTypeCode

·托布利安

·托比特

·托卡尔

·今天

·今天的

·加倍

·ToInt16

·ToInt32

·ToInt64

·托斯比特

·托辛格尔

·托斯特林

·打字

·图因特16

·图因特32

·图因特64

Convert类有许多实现,可以在 turn,由实现IConvertible接口的类调用

也许对你有帮助

如果类实现了IConvertable接口,则可以使用 System.Convert.ChangeType更改数据类型:

把ChangeType看作VB中一个大的switch语句select case… 有很多重载函数。类似于以下免责声明: 这是一个伪代码,而不是.NET的 实施:

声明实现IConvertible接口的类必须实现 上述交换机结构中的所有转换加上GetTypeCode:

·GetTypeCode

·托布利安

·托比特

·托卡尔

·今天

·今天的

·加倍

·ToInt16

·ToInt32

·ToInt64

·托斯比特

·托辛格尔

·托斯特林

·打字

·图因特16

·图因特32

·图因特64

Convert类有许多实现,可以在 turn,由实现IConvertible接口的类调用

根据Convert.ChangeTypeObject,Type执行以下一般行为:

如果输入为空 如果类型是值类型,则抛出。 否则返回null。 如果输入不可转换 如果类型正好是输入的类型,则返回输入。 否则就扔。 如果该类型是开箱即用型芯可转换类型之一,请在输入上调用相应的ToWhatever方法。 在每种情况下,如果类型匹配,则实现似乎返回这个,否则返回Convert.ToWhateverthis,这是排序的快捷方式。 否则,对输入调用ToType,并将类型传递给。 根据Convert.ChangeTypeObject,Type执行以下一般行为:

如果输入为空 如果类型是值类型,则抛出。 否则返回null。 如果输入不可转换 如果类型正好是输入的类型,则返回输入。 否则就扔。 如果该类型是开箱即用型芯可转换类型之一,请在输入上调用相应的ToWhatever方法。 在每种情况下,如果类型匹配,则实现似乎返回这个,否则返回Convert.ToWhateverthis,这是排序的快捷方式。 否则,对输入调用ToType,并将类型传递给。
好的,但字符串只是一个例子。对于Int64如何。同样的事情:Convert.ChangeTypemyInt64,typeOfIn64调用myInt64.ToInt64
myInt从reflector返回MyInt64,看起来对于核心IConvertible实现者,X.ToY被实现为return Convert.ToYthis,除了X==Y之外,它被实现为return this。谢谢@Rawling,我想这就是我想要的答案。好吧,但string只是一个例子。对于Int64,情况如何。同样:Convert.ChangeTypemyInt64,typeOfIn64调用myInt64.ToInt64myInt从reflector返回myInt64,对于核心IConvertible实现程序,X.ToY实现为return Convert.ToYthis,除了X==Y,在这里它被实现为return this。这是达到这个程度的捷径。谢谢@Rawling,我想这就是我想要的答案。这和Convert.ChangeType一样吗?哇,我是说ChangeType。这和Convert.ChangeType一样吗?哇,我是说ChangeType。
decimal x = (decimal) System.Convert.ChangeType("5", typeof(decimal));
public static Object ChangeType(Object value, TypeCode typeCode , IFormatProvider provider)
{

IConvertible v = value as IConvertible;

switch (typeCode) {

case TypeCode.Boolean:
    return v.ToBoolean(provider);

case TypeCode.Char:
    return v.ToChar(provider);

case TypeCode.SByte:
    return v.ToSByte(provider);

case TypeCode.Byte:
    return v.ToByte(provider);

case TypeCode.Int16:
    return v.ToInt16(provider);

case TypeCode.UInt16:
    return v.ToUInt16(provider);

. . .

}