using System; public struct Foo { public readonly long Value; public Foo (long value) { this.Value = value; } public static implicit operator Foo (long value) { return new Foo (value); } } public struct Bar { public readonly Foo Foo; public Bar (Foo foo) { this.Foo = foo; } public static implicit operator Bar (Foo foo) { return new Bar (foo); } } public struct Baz { public readonly Foo Foo; public Baz (Foo foo) { this.Foo = foo; } public static explicit operator Baz (Foo foo) { return new Baz (foo); } } struct S { public static implicit operator bool?(S arg) { throw new ApplicationException ("should not be called"); } } class X { public static int Main () { int a = 3; int? b = a; int? b0 = null; Foo? f1 = a; Foo? f2 = b; Foo? f3 = b0; Foo f4 = (Foo) b; Bar? b1 = f1; Bar? b2 = f2; Bar? b3 = f3; Bar b4 = (Bar) f2; Baz? z1 = (Baz?) f1; Baz? z2 = (Baz?) f2; Baz? z3 = (Baz?) f3; Baz z4 = (Baz) f2; S? s = null; bool? g = s; if (g != null) return 1; return 0; } }