Se parece depender de la secuencia de líneas. Este código funciona:
static private List<int> a = new List<int>() { 1 };
static private List<int> b = new List<int>() { a[0] };
mientras que este código no funciona (que arroja un NullReferenceException
)
static private List<int> a = new List<int>() { b[0] };
static private List<int> b = new List<int>() { 1 };
Así que, obviamente, no existen reglas para la dependencia cíclica. Es curioso sin embargo, que el compilador no se queja ...
EDITAR - ¿Qué está pasando "a través de los archivos"? Si declaramos estas dos clases:
public class A {
public static List<int> a = new List<int>() { B.b[0] };
}
public class B {
public static List<int> b = new List<int>() { A.a[0] };
}
y tratar de acceder a ellos con este código:
try { Console.WriteLine(B.b); } catch (Exception e) { Console.WriteLine(e.InnerException.Message.); }
try { Console.WriteLine(A.a); } catch (Exception e) { Console.WriteLine(e.InnerException.Message); }
try { Console.WriteLine(B.b); } catch (Exception e) { Console.WriteLine(e.InnerException.Message); }
estamos recibiendo esta salida:
The type initializer for 'A' threw an exception.
Object reference not set to an instance of an object.
The type initializer for 'A' threw an exception.
Así que la inicialización de B
causa una excepción en el constructor estático A
y campo de izquierdas a
con el valor predeterminado (nulo). Como a
es null
, b
tampoco se puede inicializar correctamente.
Si no tenemos dependencias cíclicas, todo funciona bien.
EDIT: En caso de que no leyó los comentarios, Jon Skeet proporciona una lectura muy interesante: The differences between static constructors and type initializers.
Creo que a través de los archivos (es decir, en diferentes clases) sucederá lo mismo. Durante la inicialización de tipo de la clase A, se le solicitará a la clase B que se inicialice, y la clase B encontrará una referencia nula a la clase A. – Panos
Ahora, en los archivos de la misma clase (clase parcial), probablemente corresponda al preprocesador determinar si falla o no. – Panos
Entonces, si A hace referencia a B.b, entonces A.a entrará en contacto con B.b? – BCS