Considere el siguiente código:C# - cierres sobre campos de clase dentro de un inicializador?
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;
}
}
(! Ignoran el diseño de la clase, no estoy realmente escribir una calculadora de este código representa meramente una repro mínimo para un problema mucho más grande que tomó un tiempo para reducir)
yo esperaría que sea:
- de impresión "16", O
- lanzar un error de tiempo de compilación si no se permite el cierre sobre un campo miembro en este escenario
En su lugar obtengo una excepción sin sentido lanzada en la línea indicada. En el 3.0 CLR es NullReferenceException; en el Silverlight CLR es el infame La operación podría desestabilizar el tiempo de ejecución.
No compila para mí .... "Se requiere una referencia de objeto para el campo, el método o la propiedad no estáticos 'ConsoleApplication2 .Square._operand'". ¿Es este tu código exacto? –
Sí, es una copia/pega, y compila para mí. –
Tenga en cuenta que estoy en VS2008 - como señaló Aaron, el equipo compilador de 2010 puede haber clasificado esto como un error (es decir, estuvo de acuerdo conmigo :)) –