Но я задумался, почему in нельзя для значимых типов игнорировать. Ведь если убрать in тогда ничего не поменяется, значение структуры будет меняться только внутри вызываемого метода.
а т.к. параметр in должен предотвратить любые попытки изменения этой структуры в вызываемом методе, там в методе копируется объект и с этим объектом уже код работает, делая что хочет
По-моему, можно было бы вполне обойтись без одного из копирований, оно бы в методе S1Foo даже с 1 копированием уже работало бы совсем в другим участком памяти, отличающимся от оригинальной структуры, нет?