7

誰でも説明できますか、なぜprivate readonly Int32[] _array = new[] {8, 7, 5};できますnullか?

この例では、それは機能しますが、_array常にそうではありませんnull。しかし、私の会社のコードには同様のコードがあり、_array常にnullです。だから私はそれを静的として宣言することを余儀なくされました。

このクラスは、私の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

2 に答える 2

11

WCF はコンストラクター (フィールド初期化子を含む) を実行しないため、WCF によって作成されたオブジェクトには null が含まれます。シリアル化コールバックを使用して、必要なその他のフィールドを初期化できます。特に、[OnDeserializing]:

[OnDeserializing]
private void InitFields(StreamingContext context)
{
    if(_array == null) _array = new[] {8, 7, 5};
}
于 2012-11-08T15:00:10.003 に答える
3

私も最近この問題に遭遇しました。静的な読み取り専用変数を持つ非静的クラスもありました。彼らはいつも現れnullました。バグだと思います

クラスに静的コンストラクターを追加して修正します。

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;
    }
}
于 2015-03-25T08:55:40.003 に答える