False positive: CS8600 - Converting null literal or possible null value to non-nullable type
- Dominant language
- C#
- Stars
- 20.7k
- Forks
- 4.3k
- PR merge metrics
- PR metrics pending
Description
**Version Used**: VS 17.8.7 (Compiler Version 4.8.0-7.23572.1, Language Version 12.0)
**Steps to Reproduce**:
Try to compile the code below (see also [sharplab](https://sharplab.io/#v2:CYLg1APgxAdgrgGwQQwEYIKYAIMzZgWAChiABABi1IEYA6AEQEtkBzGAewGcAXRgY060Awu2AYAgngQBPTo04BuYmQDMWRjG4YATgDNkfbAEkAasgRwMACXYIx2gDzs43LABUAfMQDexAJCkam4A/FhmFtjeWCwY3ApYAL7KRAFqqOy2WFbInOGWWFExcVicsfFJRBWqVABMYeaWNnY6Dp5YIFimDda29q1eRL4pgfURTfYAFG5YAG7dAJT+Q35+3AAW8rR52AC8s91KKasbgtm53Vh73NqWh35Vw2rb4zoTiynLD6nuodsF0WVEslvulMmc/oVAaVihUHiMaAA2WqjRq9HQAUQAHloYHJ2LifP54dQkaCEO5tNIAOKxbb9CbreSdZ5oxxtNasgA0WAA2gBZZDSVAYAByiAQAHU1rgJvoEKV5gBdLDOVzTOYRd5+ZZ+DX5PYc5raWjgi6hQ32LYXDpifSIOL+AIAdiwFp0Jpy2zusOSxKRpDqbgwPEJjyoJKoABYsAAlOAwN5LR1zbSu1mXLAwDAAdxRPSNDho5A8EwARLoMqX5odHYxdFgJm7jW5KTTuNsJqrw+RQnqMPMtdrHQFqJQ+OwAA7SDN9+IAejnWAAhCul1gJeIYyKjCKqcvV46KvdiBUgA)).
```csharp
#nullable enable
using System.Diagnostics.CodeAnalysis;
public interface IValueHolder
{
public T? Value { get; }
public bool HasValue { get; set; }
}
public class ValueHolder : IValueHolder
{
public ValueHolder(T value)
{
this.Value = value;
this.HasValue = true;
}
public ValueHolder()
{
}
public T? Value { get; }
public bool HasValue { get; set; }
}
public static class ValueHolderExtensions
{
public static bool TryGetValue(this IValueHolder holder, [MaybeNullWhen(false)] out T value)
{
value = holder.HasValue ? holder.Value : default;
return holder.HasValue;
}
}
public static class Test
{
public static void Run()
{
var holder = new ValueHolder("foo");
if (holder.TryGetValue(out string? value))
{
string copy = value; // !!!! WARNING !!!!
}
}
}
```
**Diagnostic Id**: `CS8600`
**Expected Behavior**:
Should compile without warning.
**Actual Behavior**:
Issues a warning.
**Observation**:
If you remove the covariance from the interface definition like
```csharp
public interface IValueHolder
```
..., the code compiles without warning.
Contributor guide
Assessment
This issue has not been assessed yet.