【问题标题】:C# cannot find static method inside public method of another classC# 在另一个类的公共方法中找不到静态方法
【发布时间】:2018-11-07 04:37:26
【问题描述】:

我有一个静态类电视:

namespace nTV {
    public static class TV {

        public static bool isOn;

        public static void SetOn(){
            //do stuff to set attribute isOn
        }
    }
}

我有类房子:

namespace nHouse{
    public class House{

        public void CheckTV(){
            TV.SetOn();
        }

    }
}

当我从 House 内部拨打 TV.SetOn()(甚至是 TV.isOn)时,它会说

TV 不包含 SetOn 的定义。

我做错了什么?如何在另一个类中找到 TV 的方法?

【问题讨论】:

  • 您确定来自 CheckTV 方法的调用使用了正确的 TV 类吗?我想使用 nTV.TV.SetOn();没用?
  • 调用:nTV.TV.SetOn();
  • 提及命名空间:using nTV;
  • 在命名空间 nHouse 或您已包含在 using 语句中的命名空间中可能还有另一个 TV 类。在添加 usings 或 prefix 命名空间之前,您必须确定是否有意设置两个 TV 类。 (右键单击TV 并选择“转到定义”)
  • 它有效,但对我来说似乎很奇怪。起初,我包含了命名空间,但它不起作用(与不包含相同的错误)。为什么nTV.TV.SetOn() 会起作用?

标签: c# methods static


【解决方案1】:

已编辑

我认为您有 2 个 TV 课程,一个在 nHouse 中,一个在 nTV 中。

原答案

按照 Vulpex 的建议,或者

using nTV; 添加到文件中。

问题是TV 的全名是nTV.TV,但是在同一个命名空间内调用时,可以缩短它。所以你要么

  • 使用全名
  • 在同一个命名空间中使用它(这里显然不可能)
  • 或添加using 声明,正如我提到的。

编辑

看起来你的问题是由于类是静态的。因此,您(根据https://stackoverflow.com/a/28123407/939213)需要使用以下语法:

使用静态 nTV;

编辑 2

我已经测试了我的第一个编辑解决方案(使用 static)并看到 a) 不需要这样做,b) 它甚至不起作用(我在 Visual Studio 中遇到错误)。这是我的代码,它工作正常。这些文件位于不同的目录中,我在每个文件之前放置了另一个带有类的命名空间(以测试这是否可能会导致 VS 关闭。它没有。)

namespace calledNS
{
    public static class CalledClass
    {
        public static void CalledMethod() { }
    }
}

using calledNS;
...
namespace callerNS
{
    public class CallerClass
    {
        public void CallerMethod() { CalledClass.CalledMethod(); }
    }
}

所以我唯一的想法(实际上最适合您的错误)是:

您有 2 个 TV 类,一个在 nHouse 中,一个在 nTV 中。

我认为这可以解释您所看到的所有行为。

【讨论】:

  • 我试过这个但没有用。它仅在我调用完整的东西nTV.TV.SetOn() 时才有效。很奇怪,不是吗?
  • @Daniel 也许重建项目会有所帮助?
  • @Daniel nTV 原来是一个类,而不是一个命名空间?只是好奇!
  • nTV 是 TV 所在的命名空间。
  • 感谢您的回复 - 但using static nTV 是否解决了您的问题?不适用于名称空间的 AFAIK,仅适用于类型。奇数。
【解决方案2】:

使用全名。你需要告诉它来自哪个命名空间。

namespace nHouse
{
    public class House
    {
        public void CheckTV()
        {
            nTV.TV.SetOn();
        } 
    } 
}

using nTV;

namespace nHouse
{
    public class House
    {
        public void CheckTV()
        {
            TV.SetOn();
        } 
    } 
}

您必须告诉编译器在哪个命名空间中查找您尝试调用的方法。除非您提供全名 nTV.TV.SetOn(),否则您必须在文件开头命名才能使用带有 using nTV; 的命名空间

working cs Fiddle

【讨论】:

  • 虽然这会使代码编译,但它并不能解释问题(“我做错了什么?”)。
  • @C.Evenhuis 因为您必须命名命名空间。它不知道去哪里寻找TV.SetOn(),因为它位于不同的命名空间中。
  • 这确实有效,但很奇怪:正如我在其他 cmets 中所说,在 nHouse 上方写 using nTV 不允许我调用 TV.SetOn(),但 nTV.TV.SetOn() 有效。
  • 您是在使用不同的文档,即文件,还是将所有内容都放在一个文件中?如果您将所有内容都放在一个文件中,则必须在文件顶部添加using nTV,所有其他using 语句所在的位置。但是我可能弄错了,也许您甚至必须在主文件中编写 using 才能使其正常工作,或者两者兼而有之。到目前为止,我只在一个文件中对其进行了测试。
  • @Vulpex 如果找不到该类,它不会说“当前上下文中不存在名称'TV'”吗?除非我遗漏了某些东西,否则它可以找到名称为TV某种类型或成员
【解决方案3】:

类的namespaces 不同nTVnHouse),这就是为什么你应该将nTV 称为using nTV;

 using nTV;

 ...   

 namespace nHouse {
   public class House{
     public void CheckTV(){
       TV.SetOn();
     }
   }

   ...
 }

如果您想通过短名称TV 来地址nTV.TV。另一种可能性是在 same 命名空间中声明 both 类:

 namespace Houses {
   public static class TV {
     public static bool isOn;

     public static void SetOn(){
       //do stuff to set attribute isOn
     }
   }
 }

 ...

 namespace Houses {
   public class House {
     public void CheckTV() {
       TV.SetOn();
     }
   }
 }

【讨论】:

    猜你喜欢
    • 2012-02-11
    • 2021-10-20
    • 2011-04-19
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-08-31
    • 1970-01-01
    相关资源
    最近更新 更多