0

このコードを実行すると、次の行で NullReferenceException が発生します。

List<Dictionary<Slot, string>> slots = new List<Dictionary<Slot, string>>();
                Dictionary<Slot, string> somedict = new Dictionary<Slot, string>();
                somedict.Add(new Slot(), "s");
                this.slots.Add(somedict);

何が起こっているのかわかりません。適切な項目で dict を作成しましたが、それをリストに追加しようとすると、NullReferenceException が発生します....

MSDN とこの Web サイトを約 2 時間調べましたが、うまくいきません。誰でも私を助けることができますか?辞書をリストに保存しようとしています。

namespace hashtable
{
    class Slot
    {
        string key;
        string value;

        public Slot()
        {
            this.key = null;
            this.value = null;
        }
    }

    class Bucket
    {
        public int count;
        public int overflow;
        public List<Dictionary<Slot, string>> slots;
        Dictionary<Slot, string> somedict;

        public Bucket()
        {
            this.count = 0;
            this.overflow = -1;
            List<Dictionary<Slot, string>> slots = new List<Dictionary<Slot, string>>();
            Dictionary<Slot, string> somedict = new Dictionary<Slot, string>();
            somedict.Add(new Slot(), "s");
            this.slots.Add(somedict);
            for (int i = 0; i < 3; ++i)
            {
            }
        }
    }
}
4

2 に答える 2

7

コンストラクBucketターはローカル変数を作成していますが、(初期化されていない) memberslotsに追加しようとしています 。somedictBucketslots

交換

List<Dictionary<Slot, string>> slots = new List<Dictionary<Slot, string>>();

this.slots = new List<Dictionary<Slot, string>>();

(これは同じです)

slots = new List<Dictionary<Slot, string>>();

で同じ問題が発生しsomedictます。のクラス メンバにするつもりがない場合はBucket、そこで宣言しないでください。Bucketその場合、コンストラクターでローカル変数として宣言しないでください。

于 2013-02-06T01:05:55.390 に答える
1

もちろん、ローカル変数を宣言するよりコンパクトな構文を使用するとvar、問題は明らかです...

var slots = new List<Dictionary<Slot, string>>();
var somedict = new Dictionary<Slot, string>();
somedict.Add(new Slot(), "s");
this.slots.Add(somedict);

DocMax が指摘したように、あなたは初期化されておらずthis.slots、おそらくそれを意味していました...

this.slots = new List<Dictionary<Slot, string>>();
var somedict = new Dictionary<Slot, string>();
somedict.Add(new Slot(), "s");
this.slots.Add(somedict);

ローカルを作成してから、後で取得できるリストに追加しているため、フィールドの宣言Bucket.somedictはおそらく冗長であると思われます。somedict

于 2013-02-06T01:21:25.000 に答える