Ok, lassen Sie uns einen Code haben:IList <mutable_struct> vs mutable_struct []
//I complie nicely
ValueType[] good = new ValueType[1];
good[0].Name = "Robin";
//I don't compile: Cannot modify expression because its not a variable
IList<ValueType> bad = new ValueType[1];
bad[0].Name = "Jerome";
struct ValueType
{
public string Name;
}
Was genau hinter den Kulissen vor sich geht, die der Compiler verursacht sträuben?
//Adding to watch the following
good.GetType().Name //Value = "ValueType[]" It's a ValueType array.
bad.GetType().Name //Value = "ValueType[]" Also a ValueType array.
Der Compiler hindert mich von einem Mitglied der Kopie des Objekts zu modifizieren möchte ich ändern. Aber warum wird eine Kopie von diesem Array erstellt?
Ein wenig mehr Forschung wirft:
var guess = (ValueType[]) bad;
guess[0].Name="Delilah";
Nun, was denken Sie bad[0].Name
ist? Das ist richtig, es ist "Delilah".
Der Compiler ist großzügig, es hindert Sie daran, eine Kopie von 'Name' zu verändern. Sehen Sie sich [Struct Variable in einem Dictionary ändern] an (http://stackoverflow.com/questions/6255305/modify-struct-variable-in-a-dictionary) –
@YuvalItzchakov ja, es ist sehr hilfreich. Warum wird es im zweiten Fall kopiert, aber nicht im ersten? – Robino
Das qn, mit dem Sie verbunden waren, war bereits uplooted. Es macht jedoch sehr offensichtlich eine Kopie des Werttyps. In meinem Beispiel fühlt es sich etwas subtiler an. – Robino