gpt4 book ai didi

c# - 什么是 'unverifiable code',为什么不好?

转载 作者:IT王子 更新时间:2023-10-29 04:42:16 25 4
gpt4 key购买 nike

我正在设计一个辅助方法来为我延迟加载某些对象,调用它看起来像这样:

public override EDC2_ORM.Customer Customer {
get { return LazyLoader.Get<EDC2_ORM.Customer>(
CustomerId, _customerDao, ()=>base.Customer, (x)=>Customer = x); }
set { base.Customer = value; }
}

当我编译这段代码时,我收到以下警告:

Warning 5 Access to member 'EDC2_ORM.Billing.Contract.Site' through a 'base' keyword from an anonymous method, lambda expression, query expression, or iterator results in unverifiable code. Consider moving the access into a helper method on the containing type.

这里的提示到底是什么,为什么我做的不好?

最佳答案

虚方法的“base.Foo”将对方法“Foo”的父定义进行非虚调用。从 CLR 2.0 开始,CLR 决定对虚拟方法的非虚拟调用可能是一个潜在的安全漏洞,并限制了可以使用 in 的场景。他们将其限制为对同一类层次结构中的虚拟方法进行非虚拟调用。

Lambda 表达式在这个过程中造成了一个问题。 Lambda 表达式通常在底层生成一个闭包,它是一个完全独立的类。所以代码“base.Foo”最终将成为一个全新类中的表达式。这会创建 CLR 验证异常。因此 C# 发出警告。

旁注:等效代码将在 VB 中运行。在VB中对于虚方法的非虚调用,会在原类中生成一个方法 stub 。非虚拟调用将在此方法中执行。 “base.Foo”将被重定向到“StubBaseFoo”(生成的名称不同)。

关于c# - 什么是 'unverifiable code',为什么不好?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/405379/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com