Ну, есть две разные причины и два разных ответа.
Для C # (и большинства родственных более старых языков) один амперсанд или отдельный канал фактически выполняет побитовые операции с переменными (побитовые, а не логические). Вот почему во всем коде C / C ++, когда кто-то хочет логический и , вы увидите двойной амперсанд в их коде.
Для VB.NET Я верю, что ответ - просто история. Устаревшие базовые языки всегда использовали «и» и «или» для выполнения операций без короткого замыкания. Это было очень плохое решение, но оно было доведено до VB.NET.
Следует отметить, что все базовые языки используют ключевые слова "и / или" для выполнения побитовых операций. В более ранних основах не было эквивалентного сочетания ключевых слов AndAlso или OrElse для принудительного короткого замыкания, поэтому вам пришлось вкладывать операторы If, чтобы получить логический эквивалентный эквивалент короткого замыкания и.