Ответ 1
Колонии используются в семи принципиально разных местах (о которых я могу думать с помощью всех в комментариях):
-
Разделение имени класса из его реализаций базового класса/интерфейса в определениях классов или в определениях общих ограничений
public class Foo : Bar { } public class Foo<T> where T : Bar { } public void Foo<T>() where T : Bar { }
-
Указание вызова другого конструктора для текущего класса или конструктора базового класса до текущего конструктора
public Foo() : base() { } public Foo(int bar) : this() { }
-
Задание глобального пространства имен (как указывает К. Ланг, это спецификатор псевдонимов пространства имен)
global::System.Console
-
Указание целевых значений атрибута
[assembly: AssemblyVersion("1.0.0.0")]
-
Указание имен параметров
Console.WriteLine(value: "Foo");
-
В качестве тройного выражения
var result = foo ? bar : baz;
-
Как часть метки
case
илиgoto
switch(foo) { case bar: break; } goto Bar; Foo: return true; Bar: return false;
-
Так как С# 6 для форматирования в интерполированных строках
Console.WriteLine($"{DateTime.Now:yyyyMMdd}");
Во всех этих случаях двоеточие не используется как оператор или ключевое слово (за исключением ::
). Он относится к категории простых синтаксических символов, таких как []
или {}
. Они просто там, чтобы компилятор точно знал, что означают другие символы вокруг них.