dotnet/roslyn

Suboptimal code for matching nullable value to constant pattern

Aperta

#42.912 aperta il 30 mar 2020

 (1 commento) (0 reazioni) (0 assegnatari)C# (4257 fork)batch import
Area-CompilersCode Gen QualityFeature - Pattern MatchingFeature Requesthelp wanted

Metriche repository

Star
 (20.414 stelle)
Metriche merge PR
 (Merge medio 6g 17h) (256 PR mergiate in 30 g)

Descrizione

See https://sharplab.io/#v2:EYLgZgpghgLgrgJwgZwLQAdYwggdsgZgB8ABARgDYACEgJhrIHYBYAKAG82ruaCHrgAe0EAbKgElkAQQDG8KCIAUAS1wwA/FQAeASioBeAHzaqy5FTIBuKlx4k+5AcLGSAolvQQ5EACYq1mroGxloG+haWbAC+bGxAA=

This issue is extracted from https://github.com/dotnet/roslyn/issues/31494

For source

static class Program
{
    public static bool IsActual(int? x) => x is 1; 
    public static bool IsExpected(int? x) => x == 1;
}

The generated code is

internal static class Program
{
    public static bool IsActual(int? x)
    {
        if (x.HasValue)
        {
            return x.GetValueOrDefault() == 1;
        }
        return false;
    }

    public static bool IsExpected(int? x)
    {
        int? num = x;
        int num2 = 1;
        return (num.GetValueOrDefault() == num2) & num.HasValue;
    }
}

The point is that we optimized == to avoid control-flow. We should do the same for the pattern-matching operations.

Guida contributor