Olm*_*lmo 6 c# linq lambda c#-3.0
在我们构建的框架中,我们需要以下模式:
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)
{}
}
Run Code Online (Sandbox Code Playgroud)
如您所见,我们在调用基础构造函数时创建了一个lambda.
public class Program
{
public static void Main()
{
Console.WriteLine(new NameRenderer(){Name = "Foo"}.Render());
}
}
Run Code Online (Sandbox Code Playgroud)
奇怪的是,当尝试实际使用lambda时,它会抛出NullReferenceException(控制台应用程序)或某种ExecutionEngineExceptionexception(IIS上的Web应用程序).
我认为原因是在调用基础构造函数之前该指针尚未就绪,因此lambda this.Name在此阶段无法捕获.
它不应该在"捕获时间"而不是"执行时间"中抛出异常吗?这种行为是否有记录?
我可以用不同的方式重构代码,但我认为值得评论.
Eri*_*ert 22
正如asgerhallas正确指出的那样,根据规范,这不应该是合法的.我们意外地允许这种虚假用法被错误检测器偷偷摸摸,该错误检测器在合法的情况下搜索"this"的错误用法.我已经修复了这个bug; C#4编译器正确地将您的程序标记为错误.
很多道歉给您带来不便; 这是我的错.
7.5.7的C#规范说:"只允许在实例构造函数,实例方法或实例访问器的块中访问此访问权限."
甚至更直接地在10.11.1中:"实例构造函数初始化程序无法访问正在创建的实例.因此,在构造函数初始化程序的参数表达式中引用它是一个编译时错误,因为它是编译时错误一个参数表达式,用于通过简单名称引用任何实例成员."
虽然该实例是根据7.5.10创建的.
嗯.这实际上很奇怪.我没有看到任何编译时错误.