Когда вы написали:
WithUnit(value = _, unit = "cm")
Вы хотели, чтобы это значило:
x => WithUnit(value = x, unit = "cm")
Но если вы внимательно посмотрите на сообщение об ошибке, вы увидите, что компилятор не видел его таким образом, он проанализировал его как:
WithUnit(x => value = x, unit = "cm"})
Как видите, _ ограничена более плотно, чем вы хотели.
_ всегда выбирает самую узкую невырожденную область видимости, какую только может. Область видимости определяется чисто синтаксически при синтаксическом анализе, без учета типов.
Под невырожденным я имею в виду, что компилятор не думал, что вы имели в виду:
WithUnit(value = x => x, unit = "cm")
Самая узкая невырожденная область действия означает область, определенную самой внутренней скобкой функции относительно подчеркивания. Без такого правила компилятор не мог бы знать, какой _ соответствует какой функции при вложенных вызовах функций.