Я думаю, что основным ограничением, которое вы можете увидеть, является возможность легко использовать API системной системы, если вам нужно, например, если вам нужно было использовать API user32 или kernel32 из Java, я думаю, что это возможно, однако это не простая задача, однако в C # это довольно легко сделать.
Также, если у вас есть некоторые устаревшие библиотеки C / C ++, вы все равно можете использовать их в приложении C #, хотя в Java все еще сложно это сделать, особенно в худшем случае, когда ваш нативный код api должен использовать указатели, вы можете использовать небезопасный режим в приложении C # для передачи указателей и выделения фиксированной памяти в стеке ... и т. д.
но, как уже упоминалось выше, Java & C # в целом имеют те же ограничения, особенно если вы хотите быть независимыми от платформы.