c# – 在基础构造函数中使用lambdas表达式的例子

前端之家收集整理的这篇文章主要介绍了c# – 在基础构造函数中使用lambdas表达式的例子前端之家小编觉得挺不错的,现在分享给大家,也给大家做个参考。
在我们构建的框架中,我们需要以下模式:
  1. public class BaseRenderer
  2. {
  3. Func<string> renderer;
  4. public BaseRenderer(Func<string> renderer)
  5. {
  6. this.renderer = renderer;
  7. }
  8.  
  9. public string Render()
  10. {
  11. return renderer();
  12. }
  13. }
  14.  
  15. public class NameRenderer : BaseRenderer
  16. {
  17. public string Name{ get; set; }
  18.  
  19. public NameRenderer ()
  20. : base(() =>this.Name)
  21. {}
  22. }

如您所见,我们在调用基础构造函数时创建了一个lambda.

  1. public class Program
  2. {
  3. public static void Main()
  4. {
  5. Console.WriteLine(new NameRenderer(){Name = "Foo"}.Render());
  6. }
  7. }

奇怪的是,当尝试实际使用lambda时,它会抛出NullReferenceException(控制台应用程序)或某种ExecutionEngineExceptionexception(IIS上的Web应用程序).

我认为原因是在调用基础构造函数之前这个指针还没有准备好,所以lambda在这个阶段无法捕获this.Name.

它不应该在“捕获时间”而不是“执行时间”中抛出异常吗?
这种行为是否有记录?

我可以用不同的方式重构代码,但我认为值得评论.

解决方法

正如asgerhallas正确指出的那样,根据规范,这不应该是合法的.我们意外地允许这种虚假用法错误检测器偷偷摸摸,该错误检测器在合法的情况下搜索“this”的错误用法.我已经修复了这个bug; C#4编译器正确地将您的程序标记错误.

很多道歉给您带来不便;这是我的错.

猜你在找的C#相关文章