閱讀英文版本

分享方式:


IConvertible 介面

定義

重要

此 API 不符合 CLS 規範。

定義方法,該方法會將實作參考的值或 實值類型轉換成具有等值的 Common Language Runtime 類型。

C#
[System.CLSCompliant(false)]
public interface IConvertible
C#
[System.CLSCompliant(false)]
[System.Runtime.InteropServices.ComVisible(true)]
public interface IConvertible
衍生
屬性

範例

下列程式碼範例示範複數類別的 IConvertible 實作,允許先將 Double 它轉換成 ,然後在該 Double 上呼叫靜態 Convert 成員。

C#
using System;

namespace ConsoleApplication2
{

    /// Class that implements IConvertible
    class Complex : IConvertible
    {
        double	x;
        double	y;

        public Complex(double x, double y)
        {
            this.x = x;
            this.y = y;
        }

        public TypeCode GetTypeCode()
        {
            return TypeCode.Object;
        }

        bool IConvertible.ToBoolean(IFormatProvider provider)
        {
            if(	(x != 0.0) || (y != 0.0) )
                return true;
            else
                return false;
        }

        double GetDoubleValue()
        {
            return Math.Sqrt(x*x + y*y);
        }

        byte IConvertible.ToByte(IFormatProvider provider)
        {
            return Convert.ToByte(GetDoubleValue());
        }

        char IConvertible.ToChar(IFormatProvider provider)
        {
            return Convert.ToChar(GetDoubleValue());
        }

        DateTime IConvertible.ToDateTime(IFormatProvider provider)
        {
            return Convert.ToDateTime(GetDoubleValue());
        }

        decimal IConvertible.ToDecimal(IFormatProvider provider)
        {
            return Convert.ToDecimal(GetDoubleValue());
        }

        double IConvertible.ToDouble(IFormatProvider provider)
        {
            return GetDoubleValue();
        }

        short IConvertible.ToInt16(IFormatProvider provider)
        {
            return Convert.ToInt16(GetDoubleValue());
        }

        int IConvertible.ToInt32(IFormatProvider provider)
        {
            return Convert.ToInt32(GetDoubleValue());
        }

        long IConvertible.ToInt64(IFormatProvider provider)
        {
            return Convert.ToInt64(GetDoubleValue());
        }

        sbyte IConvertible.ToSByte(IFormatProvider provider)
        {
            return Convert.ToSByte(GetDoubleValue());
        }

        float IConvertible.ToSingle(IFormatProvider provider)
        {
            return Convert.ToSingle(GetDoubleValue());
        }

        string IConvertible.ToString(IFormatProvider provider)
        {
            return String.Format("({0}, {1})", x, y);
        }

        object IConvertible.ToType(Type conversionType, IFormatProvider provider)
        {
            return Convert.ChangeType(GetDoubleValue(),conversionType);
        }

        ushort IConvertible.ToUInt16(IFormatProvider provider)
        {
            return Convert.ToUInt16(GetDoubleValue());
        }

        uint IConvertible.ToUInt32(IFormatProvider provider)
        {
            return Convert.ToUInt32(GetDoubleValue());
        }

        ulong IConvertible.ToUInt64(IFormatProvider provider)
        {
            return Convert.ToUInt64(GetDoubleValue());
        }
    }

    /// <summary>
    /// Summary description for Class1.
    /// </summary>
    class Class1
    {
        static void Main(string[] args)
        {

            Complex		testComplex = new Complex(4,7);

            WriteObjectInfo(testComplex);
            WriteObjectInfo(Convert.ToBoolean(testComplex));
            WriteObjectInfo(Convert.ToDecimal(testComplex));
            WriteObjectInfo(Convert.ToString(testComplex));
        }

        static void WriteObjectInfo(object testObject)
        {
            TypeCode	typeCode = Type.GetTypeCode( testObject.GetType() );

            switch( typeCode )
            {
                case TypeCode.Boolean:
                    Console.WriteLine("Boolean: {0}", testObject);
                    break;

                case TypeCode.Double:
                    Console.WriteLine("Double: {0}", testObject);
                    break;
                                
                default:
                    Console.WriteLine("{0}: {1}", typeCode.ToString(), testObject);
                    break;
            }
        }
    }
}

備註

這個介面提供方法,可將實作型別實例的值轉換為具有對等值的 Common Language Runtime 類型。 Common Language Runtime 類型為 BooleanSByte 、、 Byte Int16UInt16 Int64 Double UInt64 UInt32 Int32 Decimal DateTime Single 、、 Char 和 。 String

如果 Common Language Runtime 類型沒有有意義的轉換,則特定介面方法實作會擲回 InvalidCastException 。 例如,如果這個介面是在布林型別上實作,則方法的 ToDateTime 實作會擲回例外狀況,因為與布林類型沒有意義 DateTime 相等。

Common Language Runtime 通常會透過 Convert 類別公開 IConvertible 介面。 Common Language Runtime 也會在明確介面實作中,在內部使用 IConvertible 介面,以簡化用來支援類別和基本 Common Language Runtime 類型轉換 Convert 的程式碼。

除了 IConvertible 介面之外,.NET Framework還提供稱為類型轉換器的類別,以便將使用者定義資料類型轉換成其他資料類型。 如需詳細資訊,請參閱 一般化類型轉換 主題。

給實施者的注意事項

如果您實作 IConvertible 介面,如果 Object 參數是實作類型的實例,而且 Type 參數是 Common Language Runtime 類型,則方法會自動呼叫 ChangeType(Object, Type) 您的實作。

大部分的轉換方法都有類型的 IFormatProvider 參數,代表目前文化特性 () CurrentCulture 或特定文化特性。 在大部分的情況下, IConvertible 基底類型的實作會忽略此參數。 不過,您可以選擇是否要在程式碼中使用。

方法

GetTypeCode()

傳回這個執行個體的 TypeCode

ToBoolean(IFormatProvider)

使用指定的特定文化特性 (Culture) 之格式資訊,將這個執行個體的值轉換為相等的布林 (Boolean) 值。

ToByte(IFormatProvider)

使用指定的特定文化特性之格式資訊,將這個執行個體的值轉換為相等的 8 位元不帶正負號的整數。

ToChar(IFormatProvider)

使用指定的特定文化特性之格式資訊,將這個執行個體的值轉換為相等的 Unicode 字元。

ToDateTime(IFormatProvider)

使用指定的特定文化特性之格式資訊,將這個執行個體的值轉換為相等的 DateTime

ToDecimal(IFormatProvider)

使用指定的特定文化特性之格式資訊,將這個執行個體的值轉換為相等的 Decimal 數字。

ToDouble(IFormatProvider)

使用指定的特定文化特性之格式資訊,將這個執行個體的值轉換為相等的雙精確度浮點數。

ToInt16(IFormatProvider)

使用指定的特定文化特性之格式資訊,將這個執行個體的值轉換為相等的 16 位元帶正負號的整數。

ToInt32(IFormatProvider)

使用指定的文化特性 (Culture) 特定格式資訊,將這個執行個體的值轉換為相等的 32 位元帶正負號的整數。

ToInt64(IFormatProvider)

使用指定的文化特性 (Culture) 特定格式資訊,將這個執行個體的值轉換為相等的 64 位元帶正負號的整數。

ToSByte(IFormatProvider)

使用指定的文化特性 (Culture) 特定格式資訊,將這個執行個體的值轉換為相等的 8 位元帶正負號的整數。

ToSingle(IFormatProvider)

使用指定的特定文化特性之格式資訊,將這個執行個體的值轉換為相等的單精確度浮點數。

ToString(IFormatProvider)

使用指定的特定文化特性之格式資訊,將這個執行個體的值轉換為相等的 String

ToType(Type, IFormatProvider)

使用指定的特定文化特性之格式資訊,將這個執行個體的值轉換為具有等值的指定 ObjectType

ToUInt16(IFormatProvider)

使用指定的文化特性 (Culture) 特定格式資訊,將這個執行個體的值轉換為相等的 16 位元不帶正負號的整數。

ToUInt32(IFormatProvider)

使用指定的文化特性 (Culture) 特定格式資訊,將這個執行個體的值轉換為相等的 32 位元不帶正負號的整數。

ToUInt64(IFormatProvider)

使用指定的文化特性 (Culture) 特定格式資訊,將這個執行個體的值轉換為相等的 64 位元不帶正負號的整數。

適用於

產品 版本
.NET Core 1.0, Core 1.1, Core 2.0, Core 2.1, Core 2.2, Core 3.0, Core 3.1, 5, 6, 7
.NET Framework 1.1, 2.0, 3.0, 3.5, 4.0, 4.5, 4.5.1, 4.5.2, 4.6, 4.6.1, 4.6.2, 4.7, 4.7.1, 4.7.2, 4.8
.NET Standard 1.3, 1.4, 1.5, 1.6, 2.0, 2.1
UWP 10.0

另請參閱