Преобразование метода тела блока с параметром out в метод тела выражения приводит к тому, что параметр out имеет значение null - PullRequest
1 голос
/ 14 июня 2019

У меня есть следующий метод, который проходит прохождение модульных тестов;

    public static bool TryGetInstance<T>(out T config) where T : class
    {
        return Instance.TryGetInstance(out config);
    }

Когда я преобразую это в синтаксис тела выражения, модульные тесты не пройдут?

    public static bool TryGetInstance<T>(out T config) where T : class => 
        Instance.TryGetInstance(out config);

Неудачные тесты утверждают, что метод возвращает true и что экземпляр, возвращенный для config, не равен NULL. Я предполагал, что они скомпилированы в один и тот же IL?

Почему это может происходить?

1 Ответ

0 голосов
/ 14 июня 2019

Они семантически идентичны, как показано здесь

ИЛ идентичен:

    .method public hidebysig static 
        bool TryGetInstance1<class T> (
            [out] !!T& config
        ) cil managed 
    {
        // Method begins at RVA 0x2050
        // Code size 12 (0xc)
        .maxstack 8

        IL_0000: call class Foo P::get_Instance()
        IL_0005: ldarg.0
        IL_0006: callvirt instance bool Foo::TryGetInstance<!!T>(!!0&)
        IL_000b: ret
    } // end of method P::TryGetInstance1

    .method public hidebysig static 
        bool TryGetInstance2<class T> (
            [out] !!T& config
        ) cil managed 
    {
        // Method begins at RVA 0x205d
        // Code size 12 (0xc)
        .maxstack 8

        IL_0000: call class Foo P::get_Instance()
        IL_0005: ldarg.0
        IL_0006: callvirt instance bool Foo::TryGetInstance<!!T>(!!0&)
        IL_000b: ret
    } // end of method P::TryGetInstance2

итак: одна из двух вещей:

  1. вы сломали компилятор или JIT
  2. ошибка не там, где вы думаете

Второй вариант гораздо более распространен. Попробуйте вернуть только этот метод изменить , и посмотрите, исчезнет ли проблема.

Если это произойдет: ребята из Microsoft будут заинтересованы в репродукции.

...