手続き型音楽の日常

関数型音楽に乗り換えたい

C#/VB.NET の XML コメントに `completionlist` という謎のタグがある件

ネット上の情報が少なすぎて何なのか解明するのに非常に時間がかかったので。

忘れないために。

<completionlist cref=""/>

標準化されていないけど正しくコンパイルされるXMLタグ。

Microsoft Docs にも情報が載っていないので、何のための機能か一切わからない。

日本語の情報はここしか見つけられなかった。

yan note: .NET 定数ファイルを作成する ~その4~ インテリセンスに候補を表示する

.NET 文字列型の列挙体 - ウマヤディア

ただ、reddit には英語でこんなスレッドが立っていた。

www.reddit.com

英語が読めないので翻訳して読んだけど、なるほどなと思った。確かにこれは知恵袋にでも訊いてみたい機能だ。

解説

要は、あるクラスの変数に何かを代入しようとしたとき、 Intellisense に表示されるべき候補をクラスの静的メンバとして定義することができる機能のよう。

例えば自作クラスを作ったとして、

/// <summary> なんかのクラス </summary>
public class Test
{
    public string Value { get; set; }
}

このクラスの変数を宣言する。

public class Program
{
    public static void Main(string[] arg)
    {
        Test x;
    }
}

ここで、 x = と入力しても本来は何も出ない。 x = new まで入力すると、new Test() が補完されるけど、単純な代入ではコンパイラは何を代入すべきか理解できない。

そこで <completionlist cref="Test"/> コメントをつけて、静的メンバを定義する。

/// <summary> なんかのクラス </summary>
/// <completionlist cref="Test"/>
public class Test
{
    public static Test A => new Test('A');
    public static Test B => new Test('B');
    public static Test C => new Test('C');

    public string Value { get; set; }
}

そうすると、先ほどの x = まで入力した段階で、

  • Test.A
  • Test.B
  • Test.C

が候補として登場する。

実装されてる例としては、例えば System.Drawing.Color 。確かに lblNavi.BackgroundColor = とか入れると出てくるよね、色。

所感

これはかなり便利な機能だけど、ドキュメントを定義するはずの XML コメントとしては場違いな気がする。

なぜ標準化されていないか理由は定かでないけど、もしかしたら単純に Visual Studio しか対応してないからなのかもしれない。

ただ、属性として定義すれば IDE 関係なく使えそうな気がするんだよね。例えば System.ComponentModel.BrowsableAttribute とか完全に IDE 向け属性じゃん?

docs.microsoft.com

例えばクラス側に CompletionAttribute 属性をつけたら、宣言された変数への代入に全部そのリストが使われるとか。

例えば変数やフィールド側に CustomCompletionAttribute 属性をつけたら、その変数やフィールドだけ特別な補完リストが出てくるとか。

うーん。今までのコンパイラが対応しないとなると、今更導入しても使われなさそうだなぁ…。

現在 0000/00/00 00:00 を生きています。