2012-11-08 16 views
6

Qualcuno può spiegare, perché "privato readonly Int32 [] _array = new [] {8, 7, 5};" può essere nullo?Il campo readonly inizializzato è nullo, perché?

In questo esempio, funziona e _array non è sempre nullo. Ma nel mio codice aziendale ho un codice simliar e _array è sempre nullo. Così ho costretto a dichiararlo come statico.

La classe è una classe proxy parziale dal mio contratto WCF.

using System; 
using System.ComponentModel; 

namespace NullProblem 
{ 
    internal class Program 
    { 
     private static void Main(string[] args) 
     { 
      var myClass = new MyClass(); 

      // Null Exception in coperate code 
      int first = myClass.First; 
      // Works 
      int firstStatic = myClass.FirstStatic; 
     } 
    } 

    // My partial implemantation 
    public partial class MyClass 
    { 
     private readonly Int32[] _array = new[] {8, 7, 5}; 
     private static readonly Int32[] _arrayStatic = new[] {8, 7, 5}; 

     public int First 
     { 
      get { return _array[0]; } 
     } 

     public int FirstStatic 
     { 
      get { return _arrayStatic[0]; } 
     } 
    } 

    // from WebService Reference.cs 
    public partial class MyClass : INotifyPropertyChanged 
    { 
     // a lot of Stuff 

     #region Implementation of INotifyPropertyChanged 

     public event PropertyChangedEventHandler PropertyChanged; 

     #endregion 
    } 

} 
+4

Non è molto uso per mostrarci codice che funziona e dire che c'è qualche altro codice che non funziona. Devi darci un breve ma completo esempio che non funziona. –

+2

Se funziona qui e non nel tuo codice, è abbastanza ovvio che c'è qualcosa di sbagliato nel tuo codice. A meno che non lo pubblichi trovo difficile fornire aiuto. – Gorpik

+0

Funziona come previsto nel mio LINQPad. – Davio

risposta

10

WCF non esegue il costruttore (che include l'inizializzatore del campo), quindi qualsiasi oggetto creato da WCF avrà tale valore nullo. È possibile utilizzare una richiamata di serializzazione per inizializzare qualsiasi altro campo necessario. In particolare, [OnDeserializing]:

[OnDeserializing] 
private void InitFields(StreamingContext context) 
{ 
    if(_array == null) _array = new[] {8, 7, 5}; 
} 
+0

È possibile assegnare campi di sola lettura all'esterno di un costruttore come questo? –

+0

@Louis non senza barare, no. Il "readlonly" dovrebbe essere rimosso –

+0

barare significa riflettere? O c'è qualche attributo speciale che può essere usato? –

1

ho recentemente imbattuto in questo problema anche. Ho avuto anche una classe non statica con variabili readonly statiche. Sono sempre apparsi null. Penso che sia un bug.

Fix con l'aggiunta di un costruttore statico alla classe:

public class myClass { 
    private static readonly String MYVARIABLE = "this is not null"; 

    // Add static constructor 
    static myClass() { 
     // No need to add anything here 
    } 

    public myClass() { 
     // Non-static constructor 
    } 

    public static void setString() { 
     // Without defining the static constructor 'MYVARIABLE' would be null! 
     String myString = MYVARIABLE; 
    } 
} 
+0

Considererei questa risposta ragazzi prima di segnalare eventuali bug: http://stackoverflow.com/questions/34259304/static-property-is-null-after-being-assigned/34260123?noredirect=1 – Matt

Problemi correlati