TryGetValue pattern with C# 8 nullable reference types
If you're arriving at this a little late, like me, it turns out the .NET team addressed it through a bunch of parameter attributes like MaybeNullWhen(returnValue: true)
in the System.Diagnostics.CodeAnalysis
space which you can use for the try pattern.
Returning a swift-style nullable reference type works well, but the try pattern lets you return things like errors as additional out parameters.
public bool TryGetSession(string key, [NotNullWhen(returnValue: true)] out Session? session, [NotNullWhen(returnValue: false)] out string? error)
{
// etc
}
// This is okay:
if(TryGetSession("cheese", out var session, out var error))
{
var time = session.Time;
}
// But this is not:
_ = TryGetSession("cheese", out var session, out var error);
var time = session.Time;
// "CS8602: Dereference of a potentially null reference"
Further details:
- Documentation about the attributes
- Language Design Meeting about it.