diff --git a/snippets/fsharp/System/IConvertible/Overview/fs.fsproj b/snippets/fsharp/System/IConvertible/Overview/fs.fsproj new file mode 100644 index 00000000000..d6c57532356 --- /dev/null +++ b/snippets/fsharp/System/IConvertible/Overview/fs.fsproj @@ -0,0 +1,10 @@ + + + Exe + net6.0 + + + + + + \ No newline at end of file diff --git a/snippets/fsharp/System/IConvertible/Overview/iconvertible.fs b/snippets/fsharp/System/IConvertible/Overview/iconvertible.fs new file mode 100644 index 00000000000..fb39fe4360f --- /dev/null +++ b/snippets/fsharp/System/IConvertible/Overview/iconvertible.fs @@ -0,0 +1,77 @@ +// +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) +// \ No newline at end of file diff --git a/xml/System/IConvertible.xml b/xml/System/IConvertible.xml index ef0b3b79188..0a580dbf50b 100644 --- a/xml/System/IConvertible.xml +++ b/xml/System/IConvertible.xml @@ -64,6 +64,7 @@ :::code language="cpp" source="~/snippets/cpp/VS_Snippets_CLR_System/system.IConvertible/CPP/iconvertible.cpp" id="Snippet1"::: :::code language="csharp" source="~/snippets/csharp/System/IConvertible/Overview/iconvertible.cs" interactive="try-dotnet" id="Snippet1"::: + :::code language="fsharp" source="~/snippets/fsharp/System/IConvertible/Overview/iconvertible.fs" id="Snippet1"::: :::code language="vb" source="~/snippets/visualbasic/VS_Snippets_CLR_System/system.IConvertible/VB/iconvertible.vb" id="Snippet1"::: ]]>