C# 6では、nameof()
変数または型の名前を含む文字列を取得する演算子。
これはコンパイル時に評価されるのでしょうか、それとも Roslyn API を介して実行時に評価されるのでしょうか?
ベストアンサー1
はい。nameof()
コンパイル時に評価されます。仕様の最新バージョンを見ると、次のようになります。
nameof式は定数です。いずれの場合もnameof(...)はコンパイル時に評価される文字列を生成します。その引数は実行時に評価されず、到達不能コードとみなされます (ただし、「到達不能コード」警告は出力されません)。
それは次の図でわかりますこのTryRoslynの例ここで、
public class Foo
{
public void Bar()
{
Console.WriteLine(nameof(Foo));
}
}
コンパイルおよび逆コンパイルすると次のようになります。
public class Foo
{
public void Bar()
{
Console.WriteLine("Foo");
}
}
実行時の同等物は次のとおりです。
public class Foo
{
public void Bar()
{
Console.WriteLine(typeof(Foo).Name);
}
}
コメントで述べたように、nameof
ジェネリック型の型パラメータに を使用する場合、型パラメータの名前だけではなく、型パラメータとして使用される実際の動的型の名前が取得されることを期待しないでください。つまり、次のようになります。
public class Foo
{
public void Bar<T>()
{
Console.WriteLine(nameof(T));
}
}
となりますこれ:
public class Foo
{
public void Bar<T>()
{
Console.WriteLine("T");
}
}