Na obsah stránky

Podivný operátor /*!*/

Aleš Roubíček | | # permalink

Četl jsem si zdrojáky IronRuby a v deklarcích metod se často objevovalo podivné /*!*/. Např.

public RubyConstantAttribute(string/*!*/ name) {
  if (name == null) throw new ArgumentNullException("name");
  _name = name;
}

Nejpve jsem moc nechápal, asi nějaká interní věc (coding style) pro označování něčeho. Kontrakt v ukázce možná napoví, že by parametr neměl být null. Ale počkat, něco takového má přeci Spec#, NonNullable types. Znáte to ne, v C# 2.0 máme Nullable Value types, vyznačují se tím, že za jejich názvem je otazník, např. int?. No a Spec# ještě přidává NonNullable Reference types s vykřičníkem na konci, např. string!. No jo, ale IronRuby je přece napsaná v C#…

Kompilátor Spec# má tu výhodu, že dokáže zkompilovat C# kód. A dokonce pokud se Spec# kód mírně poupraví, tak jde naopak snadno zkompilovat kompilátorem C#. Nějak se nám to zamotává :). Pokud chcete Spec#ový kód zkompilovat v C#, ale nechat ho zkompilovatelný ve Spec#, musíte použít speciální komentáře //^ pro jednu řádku, /*^ ^*/ pro blok. A ještě je tu jedna výjimka a to právě u toho vykřičníku. /*!*/ je zkrácenou verzí /*^!^*/. A jsme doma…

Snad se dočkáme Spec#ových vychytávek v nějaké přístí verzi C#, třeba v té čtvrté. Protože předchozí ukázka by mohla vypada odost uhlazeněji:

public RubyConstantAttribute(string! name) {
  _name = name;
}

a výsledek je stejný.

Našli jste v článku chybu? Máte námět na reportáž? Založte mi ticket.