Visual studio强制转换在使用反射传递参数时是多余的



使用这行代码,VS2015显示两个参数的"Cast是冗余的"(但工作!!)。

Activator.CreateInstance(type, (IOperationContext)null, (Dictionary<string, object>)null);

而如果我删除它们,我得到:

Activator.CreateInstance(type, null, null);

抛出"System "。MissingMethodException "例外:

类型上的构造函数"iBI.Services.Hsd.Operations.Schedule。未找到RefreshUsedOperation

是有什么错误的使用或这只是假alram由visual studio?

当你调用

Activator.CreateInstance(type, null, null)

实际上调用

CreateInstance(Type type, object[] args, object[] activationAttributes)

方法重载,此CreateInstance重载查找找不到的无参数变量。

当你呼叫

Activator.CreateInstance(type, (IOperationContext)null, (Dictionary<string, object>)null);

则调用

CreateInstance(Type type, params object[] args)

过载。然后用两个参数找到并调用。

我会说这是VS的假警报,因为反射需要这些强制类型转换来知道调用哪个结构。如果没有这些强制转换,你给出的参数就没有类型,这使得Activator不可能知道要使用哪个签名,特别是如果你有多个构造函数,这些构造函数接受两个不同类型的参数。警告可能来自这样一个事实,即在几乎所有其他情况下,这确实是多余的,因为null可以适用于所有引用类型(如果您试图将null放入值类型中,编译器将向您抛出错误),并且将(有点)采用其容器的类型。在这一点上,如果你希望你可以打开Visual Studio的bug报告,因为这确实是一些可以(应该)修复的东西。

实际上,Visual Studio是正确的,因为两个类型转换是多余的。如果你删除了其中一个强制转换,但留下了另一个,VS将停止抱怨,因为你没有任何多余的强制转换,但仍然有足够的信息来调用正确的方法重载:

这两个选项都可以:

Activator.CreateInstance(type, null, (Dictionary<string, object>)null);
Activator.CreateInstance(type, (OperationContext)null, null);

这不是您的IDE的问题。只要打开MSDN,查看overrides: this和this。当你写:

Activator.CreateInstance(type, (IOperationContext)null, (Dictionary<string, object>)null);

。NET知道,它应该使用第二种方法。当你写:

Activator.CreateInstance(type, null, null);

我想,. net将它解释为第一种方法,这就是为什么你有问题。你可以试着写下一段代码:

Activator.CreateInstance(youType, args:null, activationAttributes:null);

应该能行

相关内容

  • 没有找到相关文章

最新更新