Почему бы не исспользовать var всегда и везде(кроме случаев с uint\long итп, когда нужно ограничение) ?
Зачем писать int a = 5;
string str = Console.ReadLine()...
и прочее, если можно почти всегда исспользовать var и не задумываться?
Конечно, иногда нам нужно большое число, и тогда мы пишем long a = ...
или же нам нужен символ в виде строки, и тогда мы пишем string str = "a";
Если же исспользовать var, то в таком случае он определит "a" не как long, а как int. А "str" определит не как string, а как char. Но во всех остальных случаях можно же просто писать var
Вывод типов нужен не для того, чтобы ты писал абы что, не зная о типах (как часто делают на Бейсике или Питоне), а для того, чтобы не загромождать код лишними конструкциями, когда тип и так ясен, и для облегчения рефакторинга программы. Эта фича никак не освобождает от необходимости продумывать логику программы до мельчайших деталей, в том числе - типов.
А когда выведенный тип не подходит, а нужен базовый класс, интерфейс или long вместо int, то придётся тип при объявлении явно указать.
var - это не какой-то универсальный тип. Это просто способ не искать неймспейсы и не указывать тип явно в тех случаях, когда он определяется вызываемым методом. Ты не можешь просто взять и описать переменную такого типа, поскольку компилятор не будет знать, что ты имел ввиду.
В C# есть гораздо более серьезные вещи на эту тему, например dynamic. Также поддержиавется ВБ-шный тип VariantType. Но все это работает медленно и обладает существенными ограничениями по сравнению со строгой типизацией.
И потом поймать неожиданный баг в рантайме, если в переменной окажется не тот тип, который ты ожидал