始终是nameof()等于typeof().Name?

Eri*_*ips 5 c# reflection

我已经测试了类,方法,字段,属性和枚举,看看是否有任何不正确的情况?

DotNetFiddle示例

using System;

public class Program
{
    public static void Main()
    {
        var fooType = typeof(Foo);
        ThrowIfNotEqual(fooType.Name, nameof(Foo));

        var fi = fooType.GetField(nameof(Foo.field));
        ThrowIfNotEqual(fi.Name, nameof(Foo.field));

        var pi = fooType.GetProperty(nameof(Foo.property));
        ThrowIfNotEqual(pi.Name, nameof(Foo.property));

        var mi = fooType.GetMethod(nameof(Foo.method));
        ThrowIfNotEqual(mi.Name, nameof(Foo.method));

        var fi2 = fooType.GetNestedTypes()[0];
        ThrowIfNotEqual(fi2.Name, nameof(Foo.myEnum));

        ThrowIfNotEqual("TestThisMethod", "WorksAsExpected");
    }

    public static void ThrowIfNotEqual(string a, string b)
    {
        if (a != b) throw new InvalidOperationException($"Are Not Equal: {a} != {b}");
    }

    public class Foo
    {
        public string field;
        public string property { get; set; }
        public void method() { }
        public enum myEnum
        {
            A
        }
    }
}
Run Code Online (Sandbox Code Playgroud)

结果:

运行时异常(第-1行):不等于:TestThisMethod!= WorksAsExpected

AAA*_*ddd 9

总是这样的情况nameof()是等于 typeof().Name吗?

没有很多方法可以打破这个,就像一个例子

public class Foo<T>
Run Code Online (Sandbox Code Playgroud)

例如

var fooType = typeof(Foo<string>);
Console.WriteLine(fooType.Name);
Console.WriteLine(nameof(Foo<string>));
Run Code Online (Sandbox Code Playgroud)

产量

Foo`1
Foo
Run Code Online (Sandbox Code Playgroud)

在许多情况下,您将使用预定义类型获得编译器错误 nameof()

Console.WriteLine(nameof(int)); //CS1525    Invalid expression term 'int'   
Run Code Online (Sandbox Code Playgroud)

nameof(C#参考)

备注

因为参数需要在语法上是一个表达式,所以有许多不允许列出的东西是无用的.以下值得一提的是产生错误