我無法在定義lambda表達式的函數中使用引用局部值的lambda表達式來設置結構中的值。如果我理解正確,那麼結構會在lambda函數中按值傳遞,但我希望它通過引用傳遞。我不知道怎麼做。lambda表達式中引用的結構
測試代碼:
public struct partialData
{
public int foo;
}
public struct futureData
{
public int bar;
}
// if you change this to a class, everything works as desired.
public struct someStruct
{
public partialData pd;
public futureData fd;
}
class Apple
{
private Action<object> toBeSet;
public someStruct makeStruct(partialData pd)
{
someStruct ss = new someStruct();
ss.pd = pd;
toBeSet = new Action<object>(
(futureValue) => ss.fd = (futureData)futureValue
);
return ss;
}
public void futureSet(futureData fd)
{
toBeSet.Invoke(fd);
}
}
class Program
{
static void Main(string[] args)
{
partialData pd;
pd.foo = 1;
futureData fd;
fd.bar = 2;
Apple ap=new Apple();
someStruct ss= ap.makeStruct(pd);
ap.futureSet(fd);
// I'd like it to be 1,2, it results in 1,0
Console.WriteLine("foo is: "+ss.pd.foo + ", bar is: "+ss.fd.bar);
Console.In.ReadLine();
}
}
注: 結構由別人(和用於互操作)寫的,我不能改變他們的類。我喜歡我當前的設計,所以我希望有一種方法來保持這種設計,但只需讓Action中的結構像一個類一樣。不改變爲類的另一個原因是,一些結構深深嵌套,需要更多的努力來更新,而不是我認爲必要的。
我不假設把它裝成'Object'類型,然後將它重新放回到lambda中就行了,對嗎? (如果不是醜陋的) –
其實,等一下,不管你的'makeStruct'方法本質上是否返回你的「someStruct ss」的副本?所以,即使你可以讓你的lambda目標在方法中聲明實際的「ss」實例,makeStruct的調用者是否會收到一個副本,而不是原始的呢? (可以用'ref'參數解決) –
使用ref沒有修復它,但那是我沒有想過的問題。 – Dale