Странная проблема с параметрами метода и оператором using - PullRequest
0 голосов
/ 26 марта 2020

Я только что натолкнулся на странную проблему с параметрами метода в C#, и мне было интересно, если кто-нибудь мог бы пролить свет на то, почему это происходит, или это ошибка.

Мой код, по сути, такой :

void MyMethod(SqlHelper db, int myInt)
{
    try
    {
        using (db)
        {
            var bar = OtherMethod(myInt);

В последней строке myInt выдает ошибку: «Невозможно использовать локальную переменную« myInt »до ее объявления»

Это не вызывает ошибку:

void MyMethod(SqlHelper db, int myInt)
{
    try
    {
        var foo = myInt;
        using (db)
        {

И мой обходной путь сейчас:

void MyMethod(SqlHelper db, int myInt)
{
    var foo = myInt;
    try
    {
        using (db)
        {
            var bar = OtherMethod(foo);

Но почему это происходит? Как myInt выходит за рамки использования оператора ?? Я чувствую личную атаку.

Мой проект находится в стадии разработки. Net Framework 4.7.

РЕДАКТИРОВАТЬ: Я не могу воспроизвести это в уменьшенной версии, которую я представил , Я сделаю больше исследований. Спасибо всем, кто помог.

РЕДАКТИРОВАТЬ 2: Как все заметили, я пропустил слишком много информации, и ошибка не могла быть воспроизведена. Я нашел проблему и оставлю ее здесь, потому что я тупой и, возможно, это кому-то поможет. Соответствующий код был таким:

void MyMethod(SqlHelper db, int myInt)
{
    try
    {
        using (db = new SqlHelper())
        {
            var bar = OtherMethod(myInt);
            var myInt = SomeMethod(bar);

Я объявил еще одну переменную с тем же именем ниже в операторе using, и Visual Studio это не понравилось, но я не знал, как мне это сказать. Что за день. Еще раз спасибо всем, кто пришел со мной в это путешествие.

Ответы [ 2 ]

1 голос
/ 26 марта 2020

Я пытался воспроизвести ошибку, но безуспешно, то есть созданный мной модульный тест работает. Он компилируется и не выдает никаких исключений. Таким образом, вам нужно будет предоставить нам дополнительную информацию для воспроизведения ошибки.

        private void MyMethod(IDisposable db, int myInt)
        {
            try
            {
                using (db)
                {
                    int bar = OtherMethod(myInt);
                }
            }
            catch (Exception ex)
            {
                // Do something with the exception.
                throw;
            }
        }

        private int OtherMethod(int myInt)
        {
            return myInt;
        }

        [Fact]
        public void Test1()
        {
            MyMethod(new MemoryStream(), 10);
        }

Обратите внимание, что передача SqlHelper в качестве параметра и последующее добавление в оператор using не годится практика. Вам следует избегать этого.

1 голос
/ 26 марта 2020

Одна очень странная вещь, которую вы делаете - это ваше using заявление. Вы помещаете using на db, объект, который кто-то еще создал и передал в этот метод. Когда код покидает ваш блок using, он будет удален, и тот, кто его создал, не сможет его использовать, даже если ожидается его.

Обычно объекты следует помещать в блок using, когда они созданы:

using (var db = new SqlHelper())
{
    ...
}

Не уверен, что это является причиной вашей проблемы, однако.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...