Colons are used in a dozen fundamentally different places (that I can think of, with the help of everyone in the comments):
-
Separating a class name from its base class / interface implementations in class definitions
public class Foo : Bar { } -
Specifying a generic type constraint on a generic class or method
public class Foo<T> where T : Bar { } public void Foo<T>() where T : Bar { } -
Indicating how to call another constructor on the current class or a base class’s constructor prior to the current constructor
public Foo() : base() { } public Foo(int bar) : this() { } -
Specifying the global namespace (as C. Lang points out, this is the namespace alias qualifier)
global::System.Console -
Specifying attribute targets
[assembly: AssemblyVersion("1.0.0.0")] -
Specifying parameter names
Console.WriteLine(value: "Foo"); -
As part of a ternary expression
var result = foo ? bar : baz; -
As part of a
caseorgotolabelswitch(foo) { case bar: break; } goto Bar; Foo: return true; Bar: return false; -
Since C# 6, for formatting in interpolated strings
Console.WriteLine($"{DateTime.Now:yyyyMMdd}"); -
Since C# 7, in tuple element names
var foo = (bar: "a", baz: "b"); Console.WriteLine(foo.bar);
In all these cases, the colon is not used as an operator or a keyword (with the exception of ::). It falls into the category of simple syntactic symbols, like [] or {}. They are just there to let the compiler know exactly what the other symbols around them mean.