代码分析警告CA1004使用通用方法

时间:2010-06-03 14:34:49

标签: c# generics compiler-warnings

我有以下通用方法:

// 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 个答案:

答案 0 :(得分:7)

由于您在返回类型中使用T,因此这是误报。

已在VS2010的代码分析中修复。

答案 1 :(得分:2)

这是一个合理的使用警告。问题是编译器无法从方法调用中推断出类型参数。赋值语句的左侧是 not 。例如:

  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
    }
  }

注意必须通过显式指定type参数来调用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...
}

不太确定这些是更好的解决方案,虽然吞咽异常并返回null也不会赢得奖品。打电话取决于你。