首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >Convert.ChangeType是捷径吗?

Convert.ChangeType是捷径吗?
EN

Stack Overflow用户
提问于 2012-10-08 21:19:01
回答 3查看 1.3K关注 0票数 1

我想知道当object的类型与type匹配时,Object Convert.ChangeType( Object object, Type type)内部会发生什么。它是否只是一条捷径并返回object

例如:

代码语言:javascript
复制
object objString = "Hello World";

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

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

EN

回答 3

Stack Overflow用户

回答已采纳

发布于 2012-10-08 22:55:29

根据Microsoft's C# reference source的说法,Convert.ChangeType(Object, Type)执行以下一般行为:

如果输入为null.,则返回

  • 如果类型是值类型,则返回

  • 如果输入不是IConvertible
    • 如果类型恰好是输入的类型,则返回

  • 如果类型是开箱即用的核心可转换类型之一,则在输入上调用相应的ToWhatever方法。
    • 在每种情况下,如果类型匹配,则实现看起来像是return this,否则看起来是return Convert.ToWhatever(this),这是的快捷方式

  • 会在输入上调用ToType,将类型传递给。
票数 6
EN

Stack Overflow用户

发布于 2012-10-08 21:24:56

是的,它会在对象上调用IConvertible接口。对于字符串,它将调用objString.ToString(),而后者将返回自身(返回this)。

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

如果类型没有实现IConvertible,并且您转换为不同的类型,则将抛出异常。

票数 2
EN

Stack Overflow用户

发布于 2012-10-08 21:31:02

This MSDN blog article可能会对您有所帮助。

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

代码语言:javascript
复制
decimal x = (decimal) System.Convert.ChangeType("5", typeof(decimal));

将ChangeType看作一个大的switch语句(VB中的select case )…有很多重载的函数。类似这样的东西(免责声明:这是一个伪代码,而不是确切的.NET实现):

代码语言:javascript
复制
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);

. . .

}

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

·GetTypeCode

·ToBoolean

·ToByte

·ToChar

·ToDateTime

·ToDecimal

·ToDouble

·ToInt16

·ToInt32

·ToInt64

·ToSByte

·ToSingle

·ToString

·ToType

·ToUInt16

·ToUInt32

·ToUInt64

System.Convert类有许多实现,实现IConvertible接口的类可以依次调用这些实现。

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/12782606

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档