使用这行代码,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);
应该能行