'XXXX()'是'方法',在给定的上下文中无效

Mat*_*att 0 c#

鉴于此代码:

public enum Stuff
{   
    a,b,c
}

public class RuleManager
{
    public Stuff Stuff()
    {
        return Stuff.a;
    }

    public int BizRule()
    {
        Stuff currStuff = Stuff();
        return 1; //who cares, just proving a point
    }
}
Run Code Online (Sandbox Code Playgroud)

我在public Stuff Stuff()return语句中有错误.说这Stuff()method在给定的上下文中无效的.我知道它自从方法和枚举共享相同的标记,但我想知道为什么编译器无法辨别差异以及我如何能够这样做.

好的进一步澄清,我有一个现有项目的代码编译得很好,但当放入一个新的编译器有这个问题.

为什么它会在一个类库项目中编译好,而不是另一个?

Cod*_*ter 6

我想知道为什么编译器无法辨别差异

由于C#规范第7.4章成员查找:

成员查找是确定类型上下文中名称含义的过程.

此过程遵循一组规则,这些规则最终从向外的最近范围搜索,RuleManager.Stuff()首先找到方法,然后停止搜索.因为您无法在没有括号的情况下调用方法,所以它无效并显示给定的错误.

一个简单的解决方法是引入命名空间:

namespace EnumNamespace
{
    public enum Stuff
    {
        a, b, c
    }
}

public class RuleManager
{
    public EnumNamespace.Stuff Stuff()
    {
        return EnumNamespace.Stuff.a;
    }

    public int BizRule()
    {
        EnumNamespace.Stuff currStuff = Stuff();
        return 1; //who cares, just proving a point
    }
}
Run Code Online (Sandbox Code Playgroud)

我不太清楚你的代码是如何编译的.尝试创建一个再现该问题的示例("为什么这个无效的C#代码编译?").

  • 如果你没有命名空间,`public global :: Stuff Stuff()`应该有效. (2认同)