What you are seing is one of the "automatisms" in regards to variables.
Some variables like strings are nullable which means they can have null as value and thus this is the default value for them if they are not initialized.
Other variables like (most) number variables are not nullable and thus can't have null as value. For these variables a different default value is there if they are not initialized. Like for integers 0.
Be aware that with nullable I don't mean the ? variables like int? but really the variable of the type itself if it can have the null value.
The "can't be used before initialization" is a security measure. As normally when you print out a variable that you didn't have set in any way......you get completely junk data (0 for an int, null for others, ...) thus you always should only read from a variable when it has been initialized in some kind. When it is prohibited by regardless what way then you can see this as a security feature.
Edit: To make it a bit more clear "Default" value and "initialized to" is maybe a bit confusing here. It is so that they could have had ANY value, and are just set to what is allowed for them and can represent an invalid state like null for nullable and some other value (in this case 0) for non nullable. In essence these variables are not initialized on purpose on this. They are just seemingly set to a value that is within their range (even though the compiler counts them as uninitialized still).