По умолчанию в параметре выдает NullReferenceException - PullRequest
0 голосов
/ 07 января 2019

В одном из наших тестов xUnit у нас есть метод с in параметрами, один из которых по умолчанию:

private void Method(in ClassA token, in ClassB model, in bool validate = false)
{
    if(validate)
    {}//do stuff
}

Метод был вызван без указания параметра validate, например:

[Fact]
public void TestMethod();
{
    var token = new ClassA();
    var model = new ClassB();
    Method(token, model);
}

По какой-то причине на компьютере одного разработчика параметр validate выбрасывает NullReferenceException как при выполнении, так и при отладке. Не бывает на других. Удаление ключевого слова in устраняет проблему.

Вопрос в том - можно / нужно использовать ключевое слово in с параметрами по умолчанию? И может ли это так случайно сломаться? Просматривая документацию, я не смог найти никаких признаков того, что это произойдет.

1 Ответ

0 голосов
/ 07 января 2019

Использование 'In' для типа значения 'bool' Я предполагаю, что это заставит его быть "упакованным" в ссылочный тип. Интересно, если значение по умолчанию и отсутствие передачи значения приводит к тому, что оно будет упаковано, прежде чем оно получит какое-либо значение, приводящее к пустой ссылке?

Вопрос в том, почему он ведет себя по-разному на разных машинах. Должно быть так, как на самом деле скомпилирована эта синтаксическая функция c # и, может быть, среда выполнения на двух разных машинах?

Я не понимаю, почему вам нужно использовать ключевое слово «in» для типа значения, такого как bool. Даже если значение метода bool изменяется внутри метода, это не может повлиять на стек, так как это тип значения. Также цель логического значения 'validate' состоит в том, чтобы просто проверить или нет ...

...