我有一个像工厂一样的对象方法。你给它一个类型,它创建一个实例并做一些其他的事情。一个优雅的方式(在我看来)是这样的:
public T MagicMethod<T>() where T: SomeBaseClass
{
// Magic goes here
}
但是这让FxCop感到不安,他说这是一种不好的风格 - 我得到了“CA1004:通用方法应该提供类型参数”警告。关于不使用推理和东西的事情。所以,我能想到的另一种方式就是这样:
public SomeBaseClass MagicMethod(Type T)
{
// Same magic goes here
}
我认为这不如许多帐户的第一种方法,但风格规则......关于警告的MSDN文章甚至说没有理由压制它。
我是否正确地通过抑制此警告来做到这一点?
答案 0 :(得分:17)
我相信你误解了FxCop告诉你什么,可能是因为它的措辞不太理想。这意味着泛型方法应该提供属于该类型 的参数,而不是泛型方法应该具有提供运行时的非泛型重载{{ 1}}实例。例如,
Type
public void DoSomething<T>(T myParam);
是它所指的参数。正如你所说,它想要这个的原因是推断。这允许你做类似......
myParam
而不必写
string foo = "bar";
DoSomething(foo);
在您的情况下,可以取消警告,因为您希望用户明确指定类型。不过,我建议您(假设您的构造函数是无参数的)将DoSomething<string>(foo);
更改为where
。这意味着它将指示编译器要求传入的任何类型都具有无参数构造函数。这也意味着您可以在代码中执行where T : SomeBaseClass, new()
。
答案 1 :(得分:5)
压制此警告我没有问题。对于初学者来说,MS自己的代码中的等价物是Activator.CreateInstance<T>()
public static T CreateInstance<T>()
这意味着分析规则应考虑泛型参数是否涵盖方法的返回类型 ...
之前在很多地方已经提到过:
例如,规则中存在先前的错误:
public static void GenericMethod<T>(List<T> arg);
以前会触发它(fixed in 2005 SP1)。
我建议为您的具体示例提交连接错误
答案 2 :(得分:3)
FXCop警告只是 - 警告。就像隐式投射警告一样,它们可以让你知道你正在做的事情可能有你没有预料到的行为,或者可能不是你想要的行为。
通过查看代码,确定您是否确实打算这样做来处理隐式转换警告,如果是,则添加显式转换。
与FXCop相同。查看警告,查看代码,并确定警告是否有效。如果是,请修复它。如果没有,请压制它。抑制相当于一个明确的演员 - “是的,FXCop,我确定我想这样做。”
如果它真的是一个错误,那可能是编译器错误。
答案 3 :(得分:1)
即使你在一个或多个参数中使用泛型类型参数,如果没有“剥离”,FxCop也会触发该警告:
public void LinkedList<T> Slice<T>(LinkedList<T> collection, Predicate<T> match)
{
...
}
至少规则'CA1004'前几天在这个签名的方法上解雇了“错误”。
为了比FxCop团队更聪明,我不确定规则是否能够在所有情况下正确地确定代码,这就是置信水平的原因:)
答案 4 :(得分:0)
第二种方法甚至不等同于第一种方法。在第二个中,你实际上给出了一个类型,但你不能实例化那种类型的对象(除非你使用Reflection --- eeek!)并且你必须显式地声明返回类型(这违背了泛型的目的)从...开始。
请参阅this有关抑制它的说明。看起来好像可以抑制。
编辑:现在这是另一个想法。如果您将其更改为“out”参数并且未通过返回变量返回该怎么办?它会删除警告吗?
public void MagicMethod<T>( out T retVar ) where T: SomeBaseClass
{
// Magic goes here
}
答案 5 :(得分:0)
就个人而言,我会在Fxcop中担心大多数警告。
您似乎知道自己在做什么,为什么某些自动化软件会更好地了解?
嗯,它不能,这是猜测。
答案 6 :(得分:0)
首先,警告只是为了确保来电者有意识地完成所有事情。可以在不传递任何类型参数的情况下调用方法,因为编译器事先知道对象的类型。 FxCop告诉你让它隐含,以便使用泛型和非泛型重载的语法看起来完全相同(我不同意这个原则,但这是个人的,在这里不相关)。
其次,你的第二种方法会造成比你现在想象的更多的伤害。那里没有编译时类型检查,因此如果您使用它,请注意运行时无效的强制转换异常。