为什么我不能在编译时知道所有名称时使用nameof?

5ar*_*gon 3 .net c# generics

public void Test<T>()
{
    Console.WriteLine(nameof(T));
}

Test<int>();
Run Code Online (Sandbox Code Playgroud)

这个代码字面上打印T而不是int,这根本没用.我想获得一个实际泛型类型参数的名称,而不使用反射(typeof然后对Type变量进行操作等)

我读到泛型的要点是在编译时准备好在定义中使用不同类型的代码的变体.并且nameof也是一个编译时运算符.在这种情况下,它应该足以知道这里的T是一个int.除了必须从用户端执行此操作之外,必须有一些方法可以执行此操作(例如Test<int>(nameof(int)))

如果有人对这个用例很好奇,除了调试之外我还想把这个项目的类名作为键添加到字典中.这本词典中只有一种形状.

public AddShape<T>(T shape) where T : Shape
{
    dict.Add(nameof(T), shape.SerializableShape);
}
Run Code Online (Sandbox Code Playgroud)

Sam*_*nen 5

nameof构造用于在编译时确定类型,变量,字段等的名称.在运行时需要类型时,它不会帮助您.你能做的就是使用对象的类型信息:

public AddShape<T>(T shape) where T : Shape
{
    dict.Add(shape.GetType().FullName, shape.SerializableShape);
}
Run Code Online (Sandbox Code Playgroud)

  • 为什么不将Type本身添加为字典的键? (2认同)

Ehs*_*jad 2

因为 nameof在编译时使用类型信息,并且会使用名称作为字符串,但对于泛型类型,T编译器无法在编译时弄清楚这一点,因为它将作为参数传递,从它可以使用的地方Shape或任何子类型传递这就是它会在运行时初始化的原因,所以这就是为什么它不能像上面那样使用。

我还发现了这个相关的内容,这也会有所帮助:

/sf/answers/2091525341/

希望能帮助到你