请耐心等待,因为这可能很难解释(但不要担心,我的屏幕录像只是为了这个!)。
我们正在运行一个Azure工作进程来处理来自队列的消息。 Azure接收消息并开始处理逻辑。
在执行期间,我们转到数据库并获取日志记录(使用EF,而不是懒惰,因为它返回一个完整的对象)。下一步是验证对象不为空。
var log = Repo.Find(fileId);
if (log == null)
{
该对象不为null。表达式的计算结果为false。将鼠标悬停在Visual Studio中的==
上会显示表达式为false。在立即窗口中运行此代码将显示评估为false。代码不应该进入if
块。
注意我说“不应该”。
在if块中我们抛出一个异常。出于某种原因,即使表达式求值为false,也会抛出异常。无论什么类型的异常都没关系,因为我尝试了两种不同的类型。
最后一点是我从if
块中删除了异常并执行了一些其他逻辑,按预期跳过该块。
因此,以下功能符合预期:
var log = Repo.Find(fileId);
if (log == null)
{
var x = 1;
}
但是下面的代码没有:
var log = Repo.Find(fileId);
if (log == null)
{
var exceptionText = "The specified log could not be found.";
throw new ArgumentException(exceptionText);
}
以下是一些截屏视频,以证明我并不疯狂(以及更好地定义正在发生的事情)
Screencast showing without exception
只是为了完全披露,我也尝试使用log.Equals(null)
并获得相同的结果。看起来Object.Equals null的所有变体总是在这里返回相同的结果(false)。
答案 0 :(得分:0)
你的代码是正确的,你不应该得到例外,但是当有人在Visual Studio for AOP(PostSharp等)中使用第三方工具时,通常会发生这样的事情。你能检查一下吗?如果您使用它,尝试删除属性并再次运行这段代码,我认为问题将消失。