using System; namespace ICSharpCode.Decompiler.Tests.TestCases.Correctness { class NullPropagation { static void Main() { new NullPropagation().TestNotCoalescing(); new NullPropagation().TestNullableBoolInChain(); #if CS72 new NullPropagation().TestRefStructNotCoalescing(); #endif } class MyClass { public string Text; public bool? Flag; } void TestNotCoalescing() { Console.WriteLine("TestNotCoalescing:"); Console.WriteLine(NotCoalescing(null)); Console.WriteLine(NotCoalescing(new MyClass())); } string NotCoalescing(MyClass c) { return c != null ? c.Text : "Hello"; } void TestNullableBoolInChain() { Console.WriteLine("TestNullableBoolInChain:"); foreach (MyClass c in new[] { null, new MyClass(), new MyClass { Flag = false }, new MyClass { Flag = true } }) { Console.WriteLine(EqualsTrue(c)); Console.WriteLine(GetValueOrDefaultToString(c) ?? ""); } } bool EqualsTrue(MyClass c) { return c?.Flag == true; } string GetValueOrDefaultToString(MyClass c) { return c?.Flag.GetValueOrDefault().ToString(); } #if CS72 ref struct ByRefLikeStruct { public int Value; } class RefStructHolder { public ByRefLikeStruct Get() { ByRefLikeStruct result = default(ByRefLikeStruct); result.Value = 42; return result; } } void TestRefStructNotCoalescing() { Console.WriteLine("TestRefStructNotCoalescing:"); Console.WriteLine(RefStructNotCoalescing(null).Value); Console.WriteLine(RefStructNotCoalescing(new RefStructHolder()).Value); } // A by-ref-like return type cannot be turned into a ?. / ?? null-propagation: a ref struct // cannot be wrapped in Nullable, so that form does not compile. ByRefLikeStruct RefStructNotCoalescing(RefStructHolder holder) { return holder != null ? holder.Get() : default(ByRefLikeStruct); } #endif } }