Переменная " x " объявлена, но никогда не использовалась ошибка

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

исходный код распечатывает ChangeConflictException x на консоли, но я удалил эту строку. Теперь, каждый раз, когда я использую этот бит кода, я получаю ошибку: "переменная 'x' объявлена, но никогда не использовалась".

какой самый эффективный способ избавиться от этой ошибки при сохранении функциональности кода?

//See http://msdn.microsoft.com/en-us/library/bb386918.aspx
try
{
    DB.SubmitChanges(ConflictMode.ContinueOnConflict);
}

catch (ChangeConflictException x)
{
    foreach (ObjectChangeConflict occ in DB.ChangeConflicts)
    {
        occ.Resolve(RefreshMode.KeepChanges);
    }
}
// Submit succeeds on second try.
DB.SubmitChanges(ConflictMode.FailOnFirstConflict);

3 ответов


компилятор прав; это может быть также:

catch (ChangeConflictException)
{
    foreach (ObjectChangeConflict occ in DB.ChangeConflicts)
    {
        occ.Resolve(RefreshMode.KeepChanges);
    }
}

который ограничивает исключения, которые входят в этот блок, но делает не объявите переменную для него. Переменная полезна, если вы хотите проверить значение, зарегистрируйте его или оберните в другое исключение. Просто для полноты (здесь не работает) вообще повторный бросок должен быть throw;, не throw x; (для сохранения трассировки стека).


хотя в этом случае вы можете просто избавиться от переменной 'x' (Как упоминалось Марком). Как правило, для сценариев, где у меня есть эти предупреждения, и я не могу изменить код (например, используя некоторые поля по отражению), Я обычно предпочитаю ничего не делать, вызывая метод условной компиляции, который подавляет такие раздражающие предупреждения.

код ниже.

    catch (ChangeConflictException x)
    {
    DoNothingWith(x);// This suppress the 'x' not used warning
    foreach (ObjectChangeConflict occ in DB.ChangeConflicts)
    {
        occ.Resolve(RefreshMode.KeepChanges);
    }
    }

    [Conditional("Debug")]
    public static void DoNothingWith(object obj){

    }

ссылка из MSDN об условном атрибуте: "Вызовы условного метода либо включены, либо опущено в зависимости от того, определен ли этот символ в точке вызова. Если символ определен, вызов включен; в противном случае вызов (включая оценку параметров вызова) опущен."


#pragma warning disable 0168

catch (ChangeConflictException x)
{
   // code here
}

#pragma warning enable 0168