作者热门文章
- c - 在位数组中找到第一个零
- linux - Unix 显示有关匹配两种模式之一的文件的信息
- 正则表达式替换多个文件
- linux - 隐藏来自 xtrace 的命令
在我们正在构建的框架中,我们需要以下模式:
public class BaseRenderer
{
Func<string> renderer;
public BaseRenderer(Func<string> renderer)
{
this.renderer = renderer;
}
public string Render()
{
return renderer();
}
}
public class NameRenderer : BaseRenderer
{
public string Name{ get; set; }
public NameRenderer ()
: base(() =>this.Name)
{}
}
如您所见,我们在调用基本构造函数时创建了一个 lambda。
public class Program
{
public static void Main()
{
Console.WriteLine(new NameRenderer(){Name = "Foo"}.Render());
}
}
奇怪的是,当尝试实际使用 lambda 时,它会抛出 NullReferenceException(控制台应用程序)或某种 ExecutionEngineException 异常(IIS 上的 Web 应用程序)。
我认为原因是这个指针在调用基础构造函数之前还没有准备好,所以lambda在这个阶段无法捕获this.Name
。
它不应该在“捕获时间”而不是“执行时间”抛出异常吗?这种行为是否记录在案?
我可以用不同的方式重构代码,但我认为它值得评论。
最佳答案
正如 asgerhallas 正确指出的那样,根据规范,这不应该是合法的。我们不小心让错误检测器偷偷摸摸地使用了这种虚假用法,错误检测器会在合法之前搜索“this”的错误用法。我已经修复了这个错误; C# 4 编译器正确地将您的程序标记为错误。
对于给您带来的不便,我们深表歉意;这是我的错误。
关于c# - 在基本构造函数中使用 lambda 表达式的极端情况,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/1875975/
SELECT DISTINCT `A/C#` AS `A/C#`, `MyRef` AS `MyRef`, DATEDIFF('2017-06-30', `Date`) AS
我是一名优秀的程序员,十分优秀!