.Netは難しいのかもしれない のつづき。
NyaRuRuさんにコメントいただきました:
「自身の破壊的変更を行うインターフェイス」を
値型に実装させるのは避けるべし,という話ですが...
そーなのかー。 ではさらにぢっけん:
interface Idata { int data { get; } } // 破壊しないぞ!
struct Val : Idata {
private int d;
public int data
{ get { return d; } }
public void setVal(int n) { d = n; } // setは別枠
}
class Program {
public static void Main() {
Idata x, y;
x = new Val();
y = x;
((Val)x).setVal(123); // Val化して値変更
System.Console.WriteLine(
"Idata of Val: x={0}, y={1}", x.data, y.data);
}
}
結果はx,yともに0となります。
((Val)x).setVal(123); が機能してない(よに見えます)。
これはどう解釈すんだ?
interfaceを値型(struct)にcast-downするとコピーが返されるてことスカ?
さらにsiokoshouさんからは:
インターフェース型は参照型なので、
インターフェース型に値型を入れたらbox化されます。
ですって。
だとしたら((Val)x).setVal(123);によって両方とも
123になんないのはナゼでスカ?
# んー、ダークサイドが見え隠れ。好きですけどねこーゆーの ^^;