Дело в том, что любая эвристика, которая может звучать правдоподобно, вероятно, не собирается ее сокращать. И когда вы просите, чтобы ваш компилятор (система сборки) выдал вывод, вы, черт побери, гарантируете, что вывод будет именно тем, что вы ожидаете.
Насколько я знаю, MSBuild этого не делает. Он всегда перестраивает (с нуля) все решение / проект. Однако, когда MSBuild вызывается из Visual Studio, временные модули компиляции сохраняются в папке \ obj вашего проекта. Очистка этой папки аналогична восстановлению.
Это сказало, что если компилятор или система сборки будет повторно использовать выходные данные, он будет использовать контрольные суммы фактического содержимого файла, чтобы определить, можно ли получить скомпилированный вывод из какого-либо другого места. По сути, это единственный надежный способ определить, нужно ли перекомпилировать файл с нуля. Кстати, это делается компилятором Visual C #, а не MSBuild.
Атрибут «дата последнего изменения» файловой системы не будет согласованным между системами и, следовательно, в конечном итоге не будет использоваться для определения, следует ли создавать с кэшированным выводом или создавать с нуля.