我发现了一个非常有趣的错误,似乎我无法弄清楚发生了什么。
提示错误的代码如下:
tower = GetVariable<ITower>("TOWER", () => { return null });
GetVariable尝试查找与作为第一个参数引入的字符串匹配的字符串,如果匹配则返回为该字符串存储的对象,否则它将返回在第二个参数中实例化的对象。我返回一个null参数,因为在实现ITower的类的情况下,我不应该在代码中继续前进,在检索此值之后,我检查nullity并在case tower为null时抛出异常。 / p>
塔可以是实现ITower接口的三个类中的任何一个,它管理程序用来测试被测单元(UUT)行为的任何和所有仪器
错误窗口会提示以下错误:
无法从lambda表达式转换为“Tools.Instruments.ITower”类型,因为它不是委托类型
如果此错误阻止我编译或运行应用程序,这将不是非常重要,因为我必须首先修复此错误。
让我担心的是我可以正常编译并在编译之后,它会提示错误窗口出现上一个错误,但是正常完成构建,我也可以运行代码而没有任何问题,但**在运行时当我通过调试器运行代码时,也会显示此错误。
这在我看来并不正常,我想知道它是否是我正在使用的代码中的错误(GetVariable是公司框架的一部分,所以我不能把代码放在这里,只是说它检索一个当一个给定的密钥存在于其中的对象,就像一个字典一样)或者我在这里缺少的东西以及它可能带来的影响。
如果提供的信息完全无效,我会尝试发布一段关于GetVariable的代码,以帮助您找到此错误的来源,我没有想法。
同样,代码运行并且行为正常,但在运行时提示此错误让我担心代码的实际行为。此代码是否可能不安全,以实际提示可能重置机器的严重错误?我不能允许这种情况发生,因为我的工作涉及测试设备并重新设置控制电源和其他仪器的计算机绝不是应该发生的事情。
答案 0 :(得分:0)
似乎我找到了问题的根源,GetVariable有2个重载,如下所示:
public T GetVariable<T>(string key, T def)
{
var variables = SequenceContext.Current.Variables;
if (variables.ContainsKey(key))
return (T)Convert.ChangeType(variables[key], typeof(T));
return def;
}
protected T GetVariable<T>(string key, Func<T> def)
{
return SequenceContext.Current.GetVariable<T>(key, def);
}
即使使用Func的那个受到保护,我也可以在代码中使用所述重载并且它表现得像预期的那样,从而提示指定的错误,因为lambda表达式无法转换为类型T
修改从protected到public的所述重载的声明修复了错误,因为现在我可以使用lambda表达式声明默认返回值,以防指定字符串不匹配。