允许我正常编译和运行程序的错误
本文关键字:运行 程序 错误 编译 常编译 允许我 | 更新日期: 2023-09-27 18:33:55
我发现了一个非常有趣的错误,似乎我无法弄清楚发生了什么。
提示错误的代码如下所示:
tower = GetVariable<ITower>("TOWER", () => { return null });
GetVariable 尝试查找与作为第一个参数引入的字符串匹配的字符串,如果匹配,它将返回为该字符串存储的对象,否则它将返回第二个参数中嵌入的对象。我返回一个 null 参数,因为在实现 ITower 的类的情况下,我应该无法继续在代码中进一步前进,在检索此值后,我检查 null 并在 tower 为 null 的情况下抛出异常。
塔可以是实现 ITower 接口的三个类中的任何一个,该接口管理程序用于测试被测单元 (UUT( 行为的任何和所有仪器
错误窗口提示以下错误:
无法从 lambda 表达式转换为类型"Tools.Instruments.ITower",因为它不是委托类型
如果此错误阻止我编译或运行应用程序,这将不是很重要,因为我必须首先修复此错误。
让我担心的是我可以正常编译,编译后,它会提示错误窗口出现上一个错误,但正常完成构建,我也可以毫无问题地运行代码,但是**在运行时此错误也显示**当我通过调试器运行代码时。
在我看来这是不正常的,我想知道这是否是我正在使用的代码中的错误(GetVariable 是公司框架的一部分,所以我不能把代码放在这里,只是说当给定的键存在时它会检索一个对象,就像字典一样(或者我在这里缺少一些东西以及这可能产生什么影响。
如果提供的信息根本没有帮助,我将尝试发布一段有关 GetVariable 的代码来帮助您帮助我找到此错误的来源,我没有想法。
同样,代码运行和行为正常,但是在运行时提示的此错误让我担心代码的实际行为。此代码是否不安全,以实际提示可以重置计算机的严重错误?我不能允许这种情况发生,因为我的工作涉及测试设备并重置控制电源和其他仪器的计算机绝不是应该发生的事情。
似乎我找到了问题的根源,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
将所述重载的声明从受保护修改为公共可以修复错误,因为现在我可以使用 lambda 表达式来声明默认返回值,以防指定字符串不匹配。