我有以下通用方法:
// 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'。
我已经考虑过这一点,我不知道如何通过限制可以反序列化的类型来执行它的请求。我坦率地承认,我可能错过了解决这个问题的简单方法。
但如果我不是,那么我是唯一能够压制这个警告的办法吗?我有一个没有警告或消息的干净项目。我想保持这种方式。
我想我在问“为什么这是一个警告?”充其量这似乎应该是一个信息。甚至那似乎有点多。它可以或不能修复。如果它不能那么你只是坚持警告没有追索权,但压制它。我错了吗?
答案 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也不会赢得奖品。打电话取决于你。