public interface class IConvertible
[System.CLSCompliant(false)]
public interface IConvertible
[System.CLSCompliant(false)]
[System.Runtime.InteropServices.ComVisible(true)]
public interface IConvertible
[<System.CLSCompliant(false)>]
type IConvertible = interface
[<System.CLSCompliant(false)>]
[<System.Runtime.InteropServices.ComVisible(true)>]
type IConvertible = interface
Public Interface IConvertible
System.Boolean

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

#using <System.dll> using namespace System; /// Class that implements IConvertible ref class Complex: public IConvertible private: double x; double y; public: Complex( double x, double y ) this->x = x; this->y = y; virtual TypeCode GetTypeCode() return TypeCode::Object; virtual bool ToBoolean( IFormatProvider^ /*provider*/ ) = IConvertible::ToBoolean if ( (x != 0.0) || (y != 0.0) ) return true; return false; double GetDoubleValue() return Math::Sqrt( x * x + y * y ); virtual Byte ToByte( IFormatProvider^ /*provider*/ ) = IConvertible::ToByte return Convert::ToByte( GetDoubleValue() ); virtual Char ToChar( IFormatProvider^ /*provider*/ ) = IConvertible::ToChar return Convert::ToChar( GetDoubleValue() ); virtual DateTime ToDateTime( IFormatProvider^ /*provider*/ ) = IConvertible::ToDateTime return Convert::ToDateTime( GetDoubleValue() ); virtual Decimal ToDecimal( IFormatProvider^ /*provider*/ ) = IConvertible::ToDecimal return Convert::ToDecimal( GetDoubleValue() ); virtual double ToDouble( IFormatProvider^ /*provider*/ ) = IConvertible::ToDouble return GetDoubleValue(); virtual short ToInt16( IFormatProvider^ /*provider*/ ) = IConvertible::ToInt16 return Convert::ToInt16( GetDoubleValue() ); virtual int ToInt32( IFormatProvider^ /*provider*/ ) = IConvertible::ToInt32 return Convert::ToInt32( GetDoubleValue() ); virtual Int64 ToInt64( IFormatProvider^ /*provider*/ ) = IConvertible::ToInt64 return Convert::ToInt64( GetDoubleValue() ); virtual signed char ToSByte( IFormatProvider^ /*provider*/ ) = IConvertible::ToSByte return Convert::ToSByte( GetDoubleValue() ); virtual float ToSingle( IFormatProvider^ /*provider*/ ) = IConvertible::ToSingle return Convert::ToSingle( GetDoubleValue() ); virtual String^ ToString( IFormatProvider^ /*provider*/ ) = IConvertible::ToString return String::Format( "( {0} , {1} )", x, y ); virtual Object^ ToType( Type^ conversionType, IFormatProvider^ /*provider*/ ) = IConvertible::ToType return Convert::ChangeType( GetDoubleValue(), conversionType ); virtual UInt16 ToUInt16( IFormatProvider^ /*provider*/ ) = IConvertible::ToUInt16 return Convert::ToUInt16( GetDoubleValue() ); virtual UInt32 ToUInt32( IFormatProvider^ /*provider*/ ) = IConvertible::ToUInt32 return Convert::ToUInt32( GetDoubleValue() ); virtual UInt64 ToUInt64( IFormatProvider^ /*provider*/ ) = IConvertible::ToUInt64 return Convert::ToUInt64( GetDoubleValue() ); 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, testObject ); break; int main() Complex^ testComplex = gcnew Complex( 4,7 ); WriteObjectInfo( testComplex ); WriteObjectInfo( Convert::ToBoolean( testComplex ) ); WriteObjectInfo( Convert::ToDecimal( testComplex ) ); WriteObjectInfo( Convert::ToString( testComplex ) ); 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; 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; open System /// Class that implements IConvertible type Complex(x, y) = member _.GetDoubleValue() = sqrt (x * x + y * y) interface IConvertible with member _.GetTypeCode() = TypeCode.Object member _.ToBoolean(provider: IFormatProvider) = (x <> 0.) || (y <> 0.) member this.ToByte(provider: IFormatProvider) = Convert.ToByte(this.GetDoubleValue()) member this.ToChar(provider: IFormatProvider) = Convert.ToChar(this.GetDoubleValue()) member this.ToDateTime(provider: IFormatProvider) = Convert.ToDateTime(this.GetDoubleValue()) member this.ToDecimal(provider: IFormatProvider) = Convert.ToDecimal(this.GetDoubleValue()) member this.ToDouble(provider: IFormatProvider) = this.GetDoubleValue() member this.ToInt16(provider: IFormatProvider) = Convert.ToInt16(this.GetDoubleValue()) member this.ToInt32(provider: IFormatProvider) = Convert.ToInt32(this.GetDoubleValue()) member this.ToInt64(provider: IFormatProvider) = Convert.ToInt64(this.GetDoubleValue()) member this.ToSByte(provider: IFormatProvider) = Convert.ToSByte(this.GetDoubleValue()) member this.ToSingle(provider: IFormatProvider) = Convert.ToSingle(this.GetDoubleValue()) member _.ToString(provider: IFormatProvider) = $"({x}, {y})" member this.ToType(conversionType: Type, provider: IFormatProvider) = Convert.ChangeType(this.GetDoubleValue(), conversionType) member this.ToUInt16(provider: IFormatProvider) = Convert.ToUInt16(this.GetDoubleValue()) member this.ToUInt32(provider: IFormatProvider) = Convert.ToUInt32(this.GetDoubleValue()) member this.ToUInt64(provider: IFormatProvider) = Convert.ToUInt64(this.GetDoubleValue()) let writeObjectInfo testObject = let typeCode = Type.GetTypeCode(testObject.GetType()) match typeCode with | TypeCode.Boolean -> printfn $"Boolean: {testObject}" | TypeCode.Double -> printfn $"Boolean: {testObject}" | _ -> printfn $"{typeCode}: {testObject}" let testComplex = Complex(4, 7) writeObjectInfo testComplex writeObjectInfo (Convert.ToBoolean testComplex) writeObjectInfo (Convert.ToDecimal testComplex) writeObjectInfo (Convert.ToString testComplex) Public Class Complex : Implements IConvertible Private x, y As Double Public Sub New(ByVal x As Double, ByVal y As Double) Me.x = x Me.y = y End Sub Function GetDoubleValue() As Double Return Math.Sqrt((x * x + y * y)) End Function ' The remaining code provides IConvertible method implementations. Public Function GetTypeCode() As TypeCode Implements IConvertible.GetTypeCode Return TypeCode.Object End Function Function ToBoolean(ByVal provider As IFormatProvider) As Boolean _ Implements IConvertible.ToBoolean Return x <> 0 OrElse y <> 0 End Function Function ToByte(ByVal provider As IFormatProvider) As Byte Implements IConvertible.ToByte Return Convert.ToByte(GetDoubleValue()) End Function Function ToChar(ByVal provider As IFormatProvider) As Char Implements IConvertible.ToChar Return Convert.ToChar(GetDoubleValue()) End Function Function ToDateTime(ByVal provider As IFormatProvider) As DateTime Implements IConvertible.ToDateTime Return Convert.ToDateTime(GetDoubleValue()) End Function Function ToDecimal(ByVal provider As IFormatProvider) As Decimal Implements IConvertible.ToDecimal Return Convert.ToDecimal(GetDoubleValue()) End Function Function ToDouble(ByVal provider As IFormatProvider) As Double Implements IConvertible.ToDouble Return GetDoubleValue() End Function Function ToInt16(ByVal provider As IFormatProvider) As Short Implements IConvertible.ToInt16 Return Convert.ToInt16(GetDoubleValue()) End Function Function ToInt32(ByVal provider As IFormatProvider) As Integer Implements IConvertible.ToInt32 Return Convert.ToInt32(GetDoubleValue()) End Function Function ToInt64(ByVal provider As IFormatProvider) As Long Implements IConvertible.ToInt64 Return Convert.ToInt64(GetDoubleValue()) End Function Function ToSByte(ByVal provider As IFormatProvider) As SByte Implements IConvertible.ToSByte Return Convert.ToSByte(GetDoubleValue()) End Function Function ToSingle(ByVal provider As IFormatProvider) As Single Implements IConvertible.ToSingle Return Convert.ToSingle(GetDoubleValue()) End Function Overloads Function ToString(ByVal provider As IFormatProvider) As String Implements IConvertible.ToString Return String.Format("({0}, {1})", x, y) End Function Function ToType(ByVal conversionType As Type, ByVal provider As IFormatProvider) As Object Implements IConvertible.ToType Return Convert.ChangeType(GetDoubleValue(), conversionType) End Function Function ToUInt16(ByVal provider As IFormatProvider) As UInt16 Implements IConvertible.ToUInt16 Return Convert.ToUInt16(GetDoubleValue()) End Function Function ToUInt32(ByVal provider As IFormatProvider) As UInt32 Implements IConvertible.ToUInt32 Return Convert.ToUInt32(GetDoubleValue()) End Function Function ToUInt64(ByVal provider As IFormatProvider) As UInt64 Implements IConvertible.ToUInt64 Return Convert.ToUInt64(GetDoubleValue()) End Function End Class Public Module Example Sub Main() Dim testComplex As New Complex(4, 7) WriteObjectInfo(testComplex) WriteObjectInfo(Convert.ToBoolean(testComplex)) WriteObjectInfo(Convert.ToDecimal(testComplex)) WriteObjectInfo(Convert.ToString(testComplex)) End Sub Sub WriteObjectInfo(ByVal testObject As Object) Dim typeCode As TypeCode = Type.GetTypeCode(testObject.GetType()) Select Case typeCode Case typeCode.Boolean Console.WriteLine("Boolean: {0}", testObject) Case typeCode.Double Console.WriteLine("Double: {0}", testObject) Case Else Console.WriteLine("{0}: {1}", typeCode.ToString(), testObject) End Select End Sub End Module

這個介面提供方法,可將實作型別實例的值轉換為具有對等值的 Common Language Runtime 類型。 Common Language Runtime 類型為 Boolean SByte 、、 Byte Int16 UInt16 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 基底類型的實作會忽略此參數。 不過,您可以選擇是否要在程式碼中使用。