In C # in quale categoria “colon”: “rientrano, e cosa significa realmente?

Ho cercato di ottenere un riferimento nel sito Web Microsoft Developer su quale sia la funzione del: è davvero ma non riesco a trovarlo perché sembra che non sia né una parola chiave né un operatore, quindi qual è la funzione dei due punti in C #? Inoltre ho visto che viene applicato a un metodo come funziona ?.

I due punti sono utilizzati in sette luoghi fondamentalmente diversi (a cui posso pensare, con l’aiuto di tutti i commenti):

  • Separazione di un nome di class dalle sue implementazioni di class base / interfaccia nelle definizioni di class o nelle definizioni di vincoli generici

     public class Foo : Bar { } public class Foo where T : Bar { } public void Foo() where T : Bar { } 
  • Indicare come chiamare un altro costruttore sulla class corrente o il costruttore di una class base prima del costruttore corrente

     public Foo() : base() { } public Foo(int bar) : this() { } 
  • Specificare lo spazio dei nomi globale (come sottolinea C. Lang , questo è il qualificatore dell’alias namespace )

     global::System.Console 
  • Specifica degli obiettivi degli attributi

     [assembly: AssemblyVersion("1.0.0.0")] 
  • Specifica dei nomi dei parametri

     Console.WriteLine(value: "Foo"); 
  • Come parte di un’espressione ternaria

     var result = foo ? bar : baz; 
  • Come parte di un case o etichetta goto

     switch(foo) { case bar: break; } goto Bar; Foo: return true; Bar: return false; 
  • Dal momento che C # 6 per la formattazione in stringhe interpolate

     Console.WriteLine($"{DateTime.Now:yyyyMMdd}"); 

In tutti questi casi, i due punti non vengono utilizzati come operatore o parola chiave (ad eccezione di :: :). Cade nella categoria dei semplici simboli sintattici, come [] o {} . Sono lì solo per far sapere al compilatore cosa significano esattamente gli altri simboli che li circondano.

La risposta di pswg è più o meno quello che stavo per fare (ha abbandonato la mia bozza quando ho visto il suo post), e dovrebbe essere la risposta accettata.

Ma non sono d’accordo sul fatto che il vincolo di tipo generico sia lo stesso di : specificando l’ereditarietà.

Ecco un esempio:

 public MyClass : IMyClass where T : IEnumerable { public DoSomething(TT foo) where TT : INotifyPropertyChanged { // ... } } 

Il : tra MyClass e IMyClass specifica l’ereditarietà. Il : tra where T e IEnumerable specifica un vincolo di tipo. I vincoli di tipo possono essere applicati ai metodi, non all’ereditarietà. I due concetti non hanno nulla in comune.

@pswg bella risposta, evviva!