Linux provides its native APIs in the C programming language. A native Linux program uses these APIs to access files, I/O devices, sockets (networking), inter-process communications, threading, etc. To create a native Linux app you would write your app in C and then compile it with (most likely) GCC to end up with an executable. You can even go further and use GUI libraries in your program to add GUI (GTK and Qt are two popular ones) or use a packaging system to package your app (like .deb and .rpm files).
C#, F# and VB bring their own compiler (which normally produces IL code instead of machine code) and instead of directly using the Windows or Linux native APIs (both in C), they have their own wrappers around them. This means that there needs to be another extra layer between the compiled code and the OS. This extra layer has to read the IL code and translate that to the native Windows or Linux or macOS APIs. This extra layer can be .NET Framework, Mono or .NET Core (currently just .NET).
Now to answer the question "Is C# usable for Linux system programming?", in most cases yes.
The .NET has libraries for file handling, networking, threading and some I/O devices. Now for example, say you need to access Bluetooth in you app. .NET does not have any APIs for Bluetooth, so in such cases you have two options:
- Find the native API in C and call it in C#
- Search in NuGet to see if someone has already done it
Other examples would be WiFi Direct, Gamepad, CPU temperature, Battery Info, Camera, GPS, Laptop Sensors, etc. So for low-level apps you're on your own (this is the case even on Windows unless you go with UWP). For such apps on Linux, C or Python would be a way better choice.
If you want to add GUI to your app, .NET has GUI libraries but only for Windows. Mono on the other hand has bindings for GTK called GTK# but naturally GTK# would always be behind the GTK development (which is not a problem unless you want the latest features).
.NET 6 has another solution for cross-platform GUI. In .NET 6 you can create a Blazor app with C#, HTML and CSS and use Electron to create a desktop app from it (as of writing this, it's not ready yet).
To sum up:
Pros of C# on Linux
- You'd use your existing skills
- If you stick to .NET libraries your app would be portable to Windows and mac
- You're dealing with a modern clean language instead of a 50-year-old one (hardcore C programmers may disagree :D)
Cons of C# on Linux
- Many native APIs are not available
- On paper native C code would be faster than framework-dependent C# code. Although it's possible to directly compile for Linux but we'd loose portability and with today's hardware users wouldn't feel the difference anyway.
- Your hands are tighter for a GUI app