我们有一个VB.net函数,在InitializerFactory类中有以下签名:
Public Shared Function Create(ByRef ui As Object) As IModeInitializer
我试图通过传递ui的模拟来测试这个函数(使用Rhino Mocks):
MainForm ui = mocks.StrictMock<MainForm>();
IModeInitializer item = InitializerFactory.Create(ref ui);
尝试将ui作为参数传递时,出现以下错误:
理想情况下,解决方案是在UI(或其类,MainForm)上提取接口,但这无论如何都不可行 - 这是一个非常臃肿的类。
我也不能将ui声明为Object
,否则我无法模仿其中的方法,因为这些方法不属于Object
类型。
我的问题是 - 我做错了什么?
答案 0 :(得分:3)
这只是因为ref参数语法。问题是该函数必须能够设置任何类型的对象,因为它是一个by参数。你不能只是传递一个对MainForm的引用,这就是你正在尝试的。
不幸的是,这是一个非常难以使用的API。
您可以通过首先将实例分配给对象来处理此问题:
MainForm ui = mocks.StrictMock<MainForm>();
object uiObj = ui;
IModeInitializer item = InitializerFactory.Create(ref uiObj);
if (uiObj != ui) {
// Handle the case where the reference changed!
ui = uiObj as MainForm; // May be null, if it's no longer a "MainForm"
}
如果您想完全理解这一点,可以阅读Covariance and Contravariance。