こんにちはゲストさん。会員登録(無料)して質問・回答してみよう!

解決済みの質問

assigning a value to structure's member accessed via collection

Class SampleA
Private SampleAPoints As New System.Collections.Generic.List(Of System.Drawing.Point)

Public ReadOnly Property Points As System.Collections.Generic.List(Of System.Drawing.Point)
Get
Return SampleAPoints
End Get
End Property


End Class

Class himajin100000

Shared Sub Main

Dim Samp As New SampleA

Samp.Points.Add(New System.Drawing.Point(80,80))
Samp.Points(0).X = 40
Samp.Points(0).Y = 40


End Sub

End Class

'とかやってたら
'Expression is a value and cannot be target of an assignment
'といわれてしまいました。

'参考
'http://connect.microsoft.com/VisualStudio/feedback/ViewFeedback.aspx?FeedbackID=295107

'どうやって切り抜けますか?

投稿日時 - 2007-09-06 12:01:52

QNo.3320160

暇なときに回答ください

質問者が選んだベストアンサー

ANo.1です。

> >何がエラーの原因かは理解されていますよね?
> 【いいえ】。

#以下は、私の認識ですので、ひょっとしたら間違っているかも・・・

> Samp.Points.Add(New System.Drawing.Point(80,80))
このとき何がおきるかと言うと、
・「System.Drawing.Point構造体」の「値」を作成
・「一時変数_1」に 作成した構造体の「値」を設定
・「一時変数_2」に SampのCollectionの「参照情報」を設定
・「一時変数_2」にある「参照情報」を元に「Add」を実行し、
 「一時変数_1」にある構造体の「値」を追加
で、その後一時変数は消滅する。
Point構造体の「値」はCollectionに格納される。

> Samp.Points(0).X = 40
このときは、
・「一時変数_1」にSampのCollectionの「参照情報」を設定
・「一時変数_1」の「参照情報」を元に設定されていた構造体の「値」を参照
・「 一時変数_2」に構造体の「値」を設定
・「 一時変数_2」のXに40を設定
で、一時変数は消滅。設定したつもりの「40」も霧と消える。

もし、Pointが構造体ではなく、クラスなら、
> Samp.Points.Add(New System.Drawing.Pointクラス(80,80))
このとき何がおきるかと言うと、

・「System.Drawing.Pointクラス」の「実体」を作成
・「一時変数_1」に 作成したクラスの「参照情報」を設定
・「一時変数_2」に SampのCollectionの「参照情報」を設定
・「一時変数_2」にある「参照情報」を元に「Add」を実行し、
 「一時変数_1」にある、クラスの「参照情報」を追加
で、その後一時変数は消滅する。
Pointクラスの「参照情報」はCollectionに格納され、参照先には、クラスの「実体」がある。

> Samp.Points(0).X = 40
このときは、
・「一時変数_1」にSampのCollectionの「参照情報」を設定
・「一時変数_1」の「参照情報」を元に設定されていたクラスの「参照情報」を参照
・「 一時変数_2」にクラスの「参照情報」を設定
・「 一時変数_2」の「参照情報」を元に、クラスの「実体」のXに40を設定
で、一時変数は消滅するが「40」は「実体」に設定されているので、残る。


> >私なら、Collectionをあきらめて配列にするかな・・・
> 当初、そう思ってました。
ふむ。

> 新たにクラスを作成し構造体をメンバ変数にしてプロパティでアクセスできるようにし,
なるほど・・・こちらのほうが良いかな・・・

でも、構造体自体をメンバにて公開にしたら同じことですよね。
#「参照情報」ではなく、構造体の「値」しか見えない。

「値変更用のメンバ」(たとえば、XとY)をクラスのメンバにしてやれば・・・

で、構造体を直接公開したメンバは「値参照」専用として使う。

#「参照情報」でイメージわかりますか?
#参照型の変数に代入される、実体を指し示している値(多分アドレス)のことです。

投稿日時 - 2007-09-06 19:45:46

このQ&Aは役に立ちましたか?

1人が「このQ&Aが役に立った」と投票しています

回答(2)

ANo.1

> 'Expression is a value and cannot be target of an assignment
> 'といわれてしまいました。

何がエラーの原因かは理解されていますよね?


> どうやって切り抜けますか?
私なら、Collectionをあきらめて配列にするかな・・・

投稿日時 - 2007-09-06 13:28:12

お礼

回答ありがとうございます。

>何がエラーの原因かは理解されていますよね?
【いいえ】。
これっぽいな、と思って添付はしてみたものの、
英文読んでもわかりません。(いっぺん死ね>俺)

(「計算結果」として扱われている、という意図のことが書いてあるのはわかるし、上記エラーメッセージもそう書いてあるのだが,
自分の力では「(Connectの記述によると)クラスだと何故成功するのか」を説明できない

なお、temp variableを設けても結局コレクションの値を変更できないから変数が増えるだけでイヤン。

方針を変えてみて,新たにクラスを作成し構造体をメンバ変数にしてプロパティでアクセスできるようにし,このクラスのコレクション・・・でもやっぱり同じエラーが。)

>私なら、Collectionをあきらめて配列にするかな・・・
当初、そう思ってました。

ところで,個人的なポリシーとしてVB6→VB.NETな人間なのでVB.NETの方が書きやすいため、VB.NETで書いてますが,出来る限りC#等でも同じ書き方でいけるように書いています。

Collectionを配列でやるとなると・・・・

http://oshiete1.goo.ne.jp/qa3277715.html
あたりで後々尾を引いて泥沼になりそうだなあ・・・という予感がしています。

http://bbs.wankuma.com/index.cgi?mode=al2&namber=7173

■7218を適当に利用して
Samp.Points.item(0) = New System.Drawing.Point(40,40)
とかやったところうまくいったようです。

#時機を見たり、気が向いたりしたら,締め切ります

投稿日時 - 2007-09-06 17:57:11