diff --git a/src/fsharp/FSharp.Core/prim-types.fs b/src/fsharp/FSharp.Core/prim-types.fs index 0aba6593b02..01908497136 100644 --- a/src/fsharp/FSharp.Core/prim-types.fs +++ b/src/fsharp/FSharp.Core/prim-types.fs @@ -4555,8 +4555,13 @@ namespace Microsoft.FSharp.Core | _ -> value.ToString() // other commmon mscorlib reference types - when 'T : StringBuilder = let x = (# "" value : StringBuilder #) in x.ToString() - when 'T : IFormattable = let x = (# "" value : IFormattable #) in x.ToString(null, CultureInfo.InvariantCulture) + when 'T : StringBuilder = + if value = unsafeDefault<'T> then "" + else let x = (# "" value : StringBuilder #) in x.ToString() + + when 'T : IFormattable = + if value = unsafeDefault<'T> then "" + else let x = (# "" value : IFormattable #) in x.ToString(null, CultureInfo.InvariantCulture) [] [] diff --git a/tests/FSharp.Core.UnitTests/FSharp.Core/OperatorsModule2.fs b/tests/FSharp.Core.UnitTests/FSharp.Core/OperatorsModule2.fs index 3a7cc87778d..5e30b9aada9 100644 --- a/tests/FSharp.Core.UnitTests/FSharp.Core/OperatorsModule2.fs +++ b/tests/FSharp.Core.UnitTests/FSharp.Core/OperatorsModule2.fs @@ -6,6 +6,7 @@ namespace FSharp.Core.UnitTests.Operators open System +open System.Text open System.Globalization open System.Threading @@ -754,6 +755,12 @@ type OperatorsModule2() = let result = Operators.string (null:string) Assert.AreEqual("", result) + let result = Operators.string (null:StringBuilder) + Assert.AreEqual("", result) + + let result = Operators.string (null:IFormattable) + Assert.AreEqual("", result) + // value type let result = Operators.string 100 Assert.AreEqual("100", result) @@ -801,6 +808,8 @@ type OperatorsModule2() = // reset the culture Thread.CurrentThread.CurrentCulture <- currentCI + + [] member _.``string: don't raise FS0670 anymore``() = // The type used here, when compiled, should not raise this error: