C# - 初始化程序中类字段的闭包?

标签 c# constructor lambda initialization closures

考虑以下代码:

using System;

namespace ConsoleApplication2
{
    class Program
    {
        static void Main(string[] args)
        {
            var square = new Square(4);
            Console.WriteLine(square.Calculate());
        }
    }

    class MathOp
    {        
        protected MathOp(Func<int> calc) { _calc = calc; }
        public int Calculate() { return _calc(); }
        private Func<int> _calc;
    }

    class Square : MathOp
    {
        public Square(int operand)
            : base(() => _operand * _operand)  // runtime exception
        {
            _operand = operand;
        }

        private int _operand;
    }
}

(忽略类设计;我实际上并不是在写计算器!此代码仅表示对需要一段时间才能缩小范围的更大问题的最小重现)

我希望它:

  • 打印“16”,或者
  • 如果在这种情况下不允许关闭成员字段,则抛出编译时错误

相反,我在指示的行处抛出了一个无意义的异常。在 3.0 CLR 上它是一个NullReferenceException;在 Silverlight CLR 上,它是臭名昭著的Operation could destabilize the runtime。

最佳答案

这是一个已修复的编译器错误。该代码从一开始就不应该是合法的,如果我们要允许它,我们至少应该生成有效代码。我的错。很抱歉给您带来不便。

关于C# - 初始化程序中类字段的闭包?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/2451311/

相关文章:

c# - LINQ - 从特定索引开始的列表中获取项目

c# - WPF 中的命令,实现问题

c++ - 编译器向空类声明添加了什么?

(POD结构,POD类和POD)成员的c++隐式类成员初始化

ruby - 我无法理解理解计算中的 lambda 演算

c++ - 未评估上下文中的默认模板参数和 lambda : bug or feature?

c# - 读取服务器中的xml文件而不保存它

c# - 在渲染页面中渲染页面

c# - .NET 精简框架 (C#) : Add checkbox to Listbox

c++ - 丢弃限定符未知原因 (std::bind()/lambda)