Анализ кода Предупреждение CA1004 с универсальным методом - PullRequest
2 голосов
/ 03 июня 2010

У меня есть следующий общий метод:

// Load an object from the disk
public static T DeserializeObject<T>(String filename) where T : class
{
    XmlSerializer xmlSerializer = new XmlSerializer(typeof(T));

    try
    {
        TextReader textReader = new StreamReader(filename);
        var result = (T)xmlSerializer.Deserialize(textReader);
        textReader.Close();
        return result;
    }
    catch (FileNotFoundException)
    { }

    return null;
}

При компиляции я получаю следующее предупреждение:
CA1004: Microsoft.Design: рассмотрим проект, в котором MiscHelpers.DeserializeObject (string) не требует явного параметра типа «T» при любом вызове.

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

Но если это не так, то единственный ли я способ подавить это предупреждение? У меня чистый проект без предупреждений или сообщений. Я хотел бы сохранить это так.

Полагаю, я спрашиваю "почему это предупреждение?" В лучшем случае кажется, что это должно быть сообщение. И даже это кажется немного большим. Либо это может, либо это не может быть исправлено. Если это невозможно, тогда вы просто застряли с предупреждением, не прибегая к помощи, но подавляя его. Я не прав?

Ответы [ 2 ]

7 голосов
/ 03 июня 2010

Поскольку вы используете T в типе возвращаемого значения, это ложное срабатывание.

Исправлено в Анализ кода для VS2010.

2 голосов
/ 03 июня 2010

Это предупреждение о добросовестном использовании. Проблема в том, что компилятор не может определить аргумент типа из вызова метода. Левая часть оператора присваивания считается , а не . Например:

  class Example {
    public T Method1<T>() {
      return default(T);
    }
    public T Method2<T>(T arg) {
      return arg;
    }

    public void Test() {
      int value1 = Method1();       // CS0411
      int value2 = Method1<int>();  // OK
      int value3 = Method2(42);     // Inferred, no problems
    }
  }

Обратите внимание, как Method1 должен вызываться путем явного указания аргумента типа. Это нормально, но усложняет использование метода. Вот почему CA1002 является предупреждением об использовании. У Method2 такой проблемы нет, компилятор может автоматически сделать вывод, что аргумент типа должен быть целым числом из типа аргумента.

Два возможных способа применения этого метода:

public static void DeserializeObject<T>(String filename, out T result) where T : class {
  // etc..
}

или

public static T DeserializeObject<T>(String filename, T defaultValue) where T : class {
  // etc...
}

Не уверен, что это лучшие решения, хотя проглатывание исключений и возврат нуля также не выигрывают призы. Вы должны сделать звонок.

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