using System; interface IFoo { T Call (); } class C1 { public void Foo (IFoo t) where T : class { t?.Call (); var x = t?.Call (); } public void Foo2 (IFoo t) { t?.Call (); } } class C2 where T : class { C2 i; T field; public void Foo () { var x = i?.field; } } class Program { static void Test(Func func) where T : struct { var r = func?.Invoke (); } static void Test2(Func func) { func?.Invoke (); } static void Main() { new C1 ().Foo (null); new C1 ().Foo2 (null); new C2 ().Foo (); Test (() => 1); Test (() => 2); } }