为什么编译器找不到正确的类型?

时间:2018-08-09 07:56:56

标签: c# compiler-errors roslyn ambiguous-grammar

我有一个同名的方法和一个类。在某种情况下,编译器了解到我在使用类名,但在另一种情况下则没有:

using System;
using DTO;

namespace DTO
{
    public class Foo
    {
        public string Bar { get; set; }
    }
}

namespace Tests
{
    class Program
    {
        static void Main(string[] args)
        {
            Console.WriteLine("Hello World!");
        }


        private void Foo()
        {
            var foo = new Foo // Ok
            {
                Bar = nameof(Foo.Bar) // Not ok
            };
        }
    }
}

错误:

CS0119 'Program.Foo()' is a method, which is not valid in the given context

我在使用静态属性时遇到了相同的错误:

public class Foo
{
    public static string Bar = "Hello";
}

// ...

private void Foo()
{
    var bar = Foo.Bar; // Error
}

如果编译器在上下文中了解Foo中的new Foo是一个类,为什么它不能理解Foo中的nameof(Foo.Bar)也是一个类?如果Foo是一种方法,则这种表示法没有任何意义。

1 个答案:

答案 0 :(得分:7)

在第一种情况下,编译器由于new关键字而知道您的意思是该类。 new之后的必须是类型名称。

在第二种情况下,没有这样的限制:Foo可以是任何变量,成员,字段或类型。 (请注意,如果这完全可行,则Bar必须是类static的{​​{1}}属性)。

但是,由于方法Foo位于最近作用域中,因此编译器认为您的意思是这个方法组,它没有名为Foo的成员。