This will only work if the "FormattedString" type is present. This will be built into .NET4.6, but it will also be available in a NuGet package for people targeting older versions of the framework. Similar to what we did with Microsoft.Bcl.Async

It will take you about 30 minutes to write an analyzer that enforces the rule "no ?. is allowed". You can add the analyzer as a reference to your projects. This will give a compile-time error (both on dev machines and on your team build server) anytime anyone uses the ?. operator.

@carlospinedag, I'm curious if you've tried the "IL Support" extension on the Visual Studio gallery? It's a third-party extension that people use to put IL directly into their VB/C# projects. Hasn't yet been updated for VS2015.

@squizfloats - You've got the right idea. This is a situation where the overall API design is forcing you to have an async signature, even though your method itself isn't async in its implementation.

Please watch the next video in the series. That discusses EXACTLY this case. Actually it discusses it in the guise of "MemoryStream". Obviously Stream has to have async APIs since most streams (disk, network, ...) are asynchronous in nature. But when you come to implement MemoryStream, it has no natural async implementation. And so it uses Task.FromResult exactly as you described.

The video talks about several useful micro-optimizations specifically for this case. Worth considering.