Переменная '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);
6
задан sooprise 29 June 2010 в 20:36
поделиться

2 ответа

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

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

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

24
ответ дан 8 December 2019 в 03:38
поделиться

Хотя в этом случае вы можете просто избавиться от переменной '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 по поводу условного атрибута: "Вызов условного метода либо включаются, либо опускаются в зависимости от того, определен ли этот символ в точке вызова. Если символ определен, вызов включается; в противном случае вызов (включая оценку параметров вызова) опущено ".

3
ответ дан 8 December 2019 в 03:38
поделиться
Другие вопросы по тегам:

Похожие вопросы: