Unityで transform.localPosition.x = 1.0f; ができないわけ

C#初心者の私がUnityで最初戸惑ったのはtransform.localPosition.x = 1.0f;というようなことができないことです。

これをやろうとすると、

error CS1612: Cannot modify a value type return value of `UnityEngine.Transform.localPosition'. Consider storing the value in a temporary variable

というエラーが出ます。UnityEngine.Transform.localPositionは変更できないよって言われてます。

なんで、こんなことになるかというと、localPositionが値型で、なおかつプロパティだからです。

Transformの定義を見ると、

public Vector3 localPosition { get; set; }

というようになっています。

これが、プロパティでなく、

public Vector3 localPosition;

という形であれば、localPosition.x = 1.0fは可能です。

また、Vector3が参照型(class)であった場合も、transform.localPosition.x = 1.0f;という風に書くことができます。

localPositionは値型を返すプロパティなので、メモリ上に一時的にできた一時変数が返されてしまうのです。
そこに値を入れたところで何も起きません。なのでエラーになるのです。

C++で考えると、プロパティは以下のような関数があるようなものです。

const Vector3 GetLocalPosition() { return localPosition; }
void SetLocalPosition( const Vector3 pos ) { localPosition = pos; }

そう考えると、Vector3で渡さないといけないのが理解しやすいんじゃないかと思います。

P.S 2018.11.25
自分の理解が浅はかだったので修正しました。