Can anyone please explain, why private readonly Int32[] _array = new[] {8, 7, 5}; can be null?
In this example, it works, and _array is always not null. But in my corporate code I have a similar code and _array is always null. So I forced to declared it as static.
The Class is a partial Proxy Class from my WCF Contract.
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
    }
}
                WCF does not run the constructor (which includes the field initializer), so any objects created by WCF will have that null. You can use a serialization callback to initialize any other fields you need. In particular, [OnDeserializing]:
[OnDeserializing]
private void InitFields(StreamingContext context)
{
    if(_array == null) _array = new[] {8, 7, 5};
}
                        I recently ran into this issue too. I had an non-static class with static readonly variables, too. They always appeared null. I think it's a bug.
Fix it by adding a static constructor to the class:
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;
    }
}
                        If you love us? You can donate to us via Paypal or buy me a coffee so we can maintain and grow! Thank you!
Donate Us With