これが機能しないことに気付きました:
var dict = new Dictionary<int, XElement>();
XContainer element;
//...
if (dict.TryGetValue(idx, out element)) { //...
それから私はこれを試しました:
class A { }
class B : A { }
class Program {
static void Main() {
A a;
a = Ret(); // no error, ok
Ref(ref a); // compiler error, ok...
Out(out a); // compiler error, lolwut?!
}
static B Ret() { return null; }
static void Ref(ref B b) { }
static void Out(out B b) { b = null; }
}
最後の呼び出しでコンパイラ エラーが発生するのはなぜですか?
編集:わかりました。答えからわかるように、「out」は変装した「ref」であるため、他の関数やスレッドによって共有および変更できます。しかし、実際には、'out' は関数から複数の値を返す方法ではないでしょうか? もしそうなら、それはそれが得意ではないようです。共有によって問題が生じる場合は、共有しないでください。関数の開始時に隠し変数を作成し、それを操作するだけです。つまり:
static void Out(out B b) {
B bHidden; // compiler generated;
// all references to b are replaced with bHidden;
b = bHidden;
}
このようにできない理由はありますか?これで安全に思えます...