2011-07-21 9 views
-2
class Foo 
{ 
    public List<object> mylist; 

    public int num; 
    public string name; 
    public bool isIt; 


    public Foo() 
    { 
     mylist = new List<object>(); 
     mylist.Add(num); 
     mylist.Add(name); 
     mylist.Add(isIt); 
    } 
} 


class Program 
{ 
    static void Main(string[] args) 
    { 

     Foo my = new Foo(); 
     my.isIt = true; 
     my.mylist[0] = 5; 
     my.mylist[1] = "Hello"; 
     Console.WriteLine("" + my.mylist[2]); => returns false instead of true 
     Console.ReadLine(); 

    } 
} 
+3

件名に説明全体を入れてはいけません。件名を簡潔にして、投稿の本文にあなたの質問が何であるかを説明してください。 –

+0

bool変数はデフォルトでfalseであるため、falseを返します。 – Reniuz

+0

いいえ、私はそれを明確にしていないと思います。私は要素が更新されたときリストの要素を更新する方法を尋ねていました。 my.isIt = true; <=外側を更新しました my.mylist [2] = true; <=内部の更新 – Vikyboss

答えて

1

ここ
private bool _isIt; 

    public List<object> mylist; 

    public bool isIt{ 
     get{return _isIt;} 
     set{ 
     _isIt = value; 
     myList[2] = value; 
     } 
    } 
+0

あなたは行く!まさに私が望んでいたもの。要素が変更されたときにリストを更新する。どうもありがとう! :) – Vikyboss

0

my.mylist [2]がfalseであるため、falseを返すのはなぜですか...あなたの質問を明確にすることができますか?宣言することで

public bool isIt; 

デフォルト値はfalseになります。

あなたが行うことができます:

public bool isIt = true; 

をtrueに、それをデフォルトに。

my.isIt = trueを設定します。すでにmylist.Add(isIt)を使ってデフォルトにfalseをコレクションに追加した後。あなたがmy.mylist [2]で追加した値を変更しません。既にリストコレクションに追加した後、my.mylist [2] = trueに設定する必要があります。

+0

私はリストを修正していないことも知っていますが、ただ一つの要素を修正するだけであれば、リスト全体に反映されるはずです。同様に、my.isIt = trueを実行します。 =>は、オブジェクトmyのリストの3番目の要素をtrueにする必要があります。ありがとう。 – Vikyboss

+0

@mservidio、boolだけでなく、すべての値の種類。 =) –

+0

haha​​、yes thanks =)私はそのコメントが間違っていることに気付き、すぐに削除しました。 – mservidio

-1
my.myList[2].isIt = true; 

あなたは正しい項目を設定しませんでした。あなたは後の行にISITの値を設定する前に、コンストラクタで:

+0

間違っています。 isItはリストのオブジェクトではなく、私のものです。 –

+0

OK ...だから、この場合、リストがインスタンス化され、リストの3番目の値がデフォルト値falseのフィールドでインスタンス化されます。その後、フィールドを更新します。リスト内のアイテムが変更されるとは思わないでしょう。 –

1

あなたはISIT(falseデフォルト)の値を使用します。特に変更したり、ロジックを変更したりしない限り、デフォルトは常にfalseになります。これは値型なので、値はコピーされ、参照されません。

3

あなたの代わりに、リストのフィールドを使用して値を変更すると、あなたのリストには、フィールドとは異なる参照を保持しているので、あなたのコードはtrueを返すされていない理由があります。あなたのコンストラクタで

お電話:

mylist.Add(isIt); 

それはobjectに箱入りの値falseを追加します。あなたがあなたのMainで次に

、:

my.isIt = true; 

あなたは、フィールドを変更しているが、リストには、まだあなたは、コンストラクタで追加した箱入りのオブジェクトを参照します。あなたがリストに格納されている値を変更したい場合は、あなたが最初に行ったように、リストを参照する必要があります。

my.myList[2] = true; 

しかし、彼らはデータの異なるコピーを参照するため、これは、リストにフィールドをリンクしません(文字列の場合、不変型への参照の異なるコピー)。 1つのポイントを変更することはできますが、他のポイントが自動的に変更されることはありません。あなたが他のフィールドのいずれかを設定しようとした場合

同じことが真のようになります。「」、偽0、および:

my.isIt = true; 
    my.num = 5; 
    my.name = "Hello"; 

彼らはまだのリストで元の値が表示されます。

本当にこれをやりたければ、Jamie Dixonが示唆するようなことをすることができます。あなたのリストは常にインデックス2でアイテムを持っているだろうと仮定すると

+0

ジェイミーが示唆したようにしました。それを説明してくれてありがとう。 :) – Vikyboss

1
mylist.Add(isIt); 

あなたはリストではなく、変数自体にISITのVALUEを追加しました。 ザッツなぜあなたが行うとき:

my.isIt = true; 

あなたは変数を更新していますが、リストには古い値に滞在します。

関連する問題