谁能解释一下,为什么 private readonly Int32[] _array = new[] {8, 7, 5}; 可以是 null
在这个例子中,它有效,并且 _array 始终不是 null 。但是在我的公司代码中,我有一个类似的代码,并且 _array 始终是 null 。所以我被迫将其声明为静态。
该类是我的 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 不运行构造函数(包括字段初始值设定项),因此 WCF 创建的任何对象都将具有该空值。您可以使用序列化回调来初始化您需要的任何其他字段。特别是 [OnDeserializing] :

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

关于c# - 初始化的只读字段为空,为什么?,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/13291428/

10-17 00:37