Because field initialisation happens at the creation of the object and a non-static item is not sure to be existing yet. To avoid a corrupted value to be passed, the compiler does not allow to use it.
your code goes down to :
Transform myTransform = this.transform;
In the method it works because when you call the method (later than initialisation), everything is ready.
Consider that this:
public float myFloat = 0.0f;
the litteral is constant and static.
You can use static methods because they always exist in the memory and do not access any data that cannot exist (instance data).
By the way, transform property has been improved in latest Unity version and caching is no more relevant.