C# 允许我正常编译和运行程序的错误

C# 允许我正常编译和运行程序的错误,c#,runtime-error,C#,Runtime Error,我发现了一个非常有趣的错误,似乎我无法弄清楚到底发生了什么 提示错误的代码如下所示: tower = GetVariable<ITower>("TOWER", () => { return null }); tower=GetVariable(“tower”,()=>{returnnull}); GetVariable尝试查找与作为第一个参数引入的字符串相匹配的字符串,如果存在匹配,它将返回为所述字符串存储的对象,否则它将返回在第二个参数中安装的对象。我返回一个null参数

我发现了一个非常有趣的错误,似乎我无法弄清楚到底发生了什么

提示错误的代码如下所示:

tower = GetVariable<ITower>("TOWER", () => { return null });
tower=GetVariable(“tower”,()=>{returnnull});
GetVariable尝试查找与作为第一个参数引入的字符串相匹配的字符串,如果存在匹配,它将返回为所述字符串存储的对象,否则它将返回在第二个参数中安装的对象。我返回一个null参数,因为对于实现了ITower的类,我不应该在代码中继续前进,在检索该值之后,我检查null值并在tower为null的情况下抛出异常

tower可以是实现ITower接口的三个类中的任意一个,该接口管理程序用于测试被测单元(UUT)行为的任何和所有仪器

“错误”窗口提示以下错误:

无法从lambda表达式转换为类型“Tools.Instruments.ITower”,因为它不是委托类型

如果此错误阻止我编译或运行应用程序,这将不是很重要,因为我必须首先修复此错误

让我担心的是,我可以正常编译,编译后,它会用以前的错误提示错误窗口,但正常完成构建,我也可以运行代码而不会出现任何问题,但是**在运行时,当我通过调试器运行代码时,也会显示**此错误

这在我看来是不正常的,我想知道这是否是我正在使用的代码中的一个bug(GetVariable是公司框架的一部分,所以我不能把代码放在这里,只是说当给定的键存在于其中时它检索一个对象,就像字典一样)或者我在这里遗漏了一些东西,这可能会有什么影响

如果提供的信息没有任何帮助,我将尝试发布一段关于GetVariable的代码,以帮助您帮助我找到这个错误的根源,我没有主意了


同样,代码运行和行为正常,但是在运行时出现的这个错误让我担心代码的实际行为。该代码是否会不安全,从而实际提示可能重置机器的严重错误?我不能允许这种情况发生,因为我的工作涉及测试设备和重置控制电源和其他仪器的计算机,这绝不是应该发生的事情。

我似乎找到了问题的根源,GetVariable有两个重载,如下所示:

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);
}
public T GetVariable(字符串键,T def)
{
var variables=SequenceContext.Current.variables;
if(变量。容器(键))
return(T)Convert.ChangeType(变量[key],typeof(T));
返回def;
}
受保护的T GetVariable(字符串键,Func def)
{
返回SequenceContext.Current.GetVariable(key,def);
}
即使使用Func的表达式受到保护,我也可以在代码中使用上述重载,它的行为与预期的一样,因此会提示指定的错误,因为lambda表达式无法转换为T类型


将所述重载的声明从protected修改为public可以修复错误,因为现在我可以使用lambda表达式来声明默认返回值,以防指定字符串不匹配。

您可以准备吗?您可以尝试将lambda表达式强制转换为
Func
或使用variable?是否
GetVariable(“TOWER”,()=>{returnnull})
接受名称作为第一个参数,接受从中获取值的对象作为第二个参数?所以
()=>{return null}
将不是合适的对象?如果不添加
GetVariable
的头,可能有助于解决您的问题。我将编辑as,以提供有关GetVariable的更多信息。您为什么不直接调用公共变量,而不使用lambda并将
null
作为第二个参数?编写方法的人可能有理由让第二个方法受到保护。如果你传递了一个错误的键,你应该会再次被提示错误,我想。如果我用第一个方法返回一个空值,我会得到一个异常,说“对象必须实现IConvertible”,这就是为什么我使用第二个方法