【问题标题】:Member '<member name>' cannot be accessed with an instance reference无法使用实例引用访问成员“<成员名称>”
【发布时间】:2010-11-09 03:47:34
【问题描述】:

我正在学习 C#,但遇到了这个问题:

namespace MyDataLayer
{
    namespace Section1
    {
        public class MyClass
        {
            public class MyItem
            {
                public static string Property1{ get; set; }
            }
            public static MyItem GetItem()
            {
                MyItem theItem = new MyItem();
                theItem.Property1 = "MyValue";
                return theItem;
            }
        }
     }
 }

我在 UserControl 上有这段代码:

using MyDataLayer.Section1;

public class MyClass
{
    protected void MyMethod
    {
        MyClass.MyItem oItem = new MyClass.MyItem();
        oItem = MyClass.GetItem();
        someLiteral.Text = oItem.Property1;
    }
}

一切正常,除非我去访问Property1。智能感知只给我“EqualsGetHashCodeGetTypeToString”作为选项。当我将鼠标悬停在oItem.Property1 上时,Visual Studio 给出了这样的解释:

MemberMyDataLayer.Section1.MyClass.MyItem.Property1.getcannot be accessed with an instance reference, qualify it with a type name instead

我不确定这意味着什么,我用谷歌搜索了一些但无法弄清楚。

【问题讨论】:

    标签: c# asp.net


    【解决方案1】:

    在 C# 中,与 VB.NET 和 Java 不同,您不能使用实例语法访问 static 成员。你应该这样做:

    MyClass.MyItem.Property1
    

    引用该属性或从Property1 中删除static 修饰符(这可能是您想要做的)。有关static is, see my other answer 的概念性想法。

    【讨论】:

      【解决方案2】:

      您只能使用类型的名称访问静态成员。

      因此,你需要写,

      MyClass.MyItem.Property1
      

      或者(这可能是您需要做的)通过从定义中删除 static 关键字来使 Property1 成为实例属性。

      静态属性在其类的所有实例之间共享,因此它们只有一个值。按照现在的定义方式,创建 MyItem 类的任何实例是没有意义的。

      【讨论】:

      • 这个“或者(这可能是您需要做的)通过从其定义中删除 static 关键字使 Property1 成为实例属性。”是成功的关键!!谢谢
      【解决方案3】:

      我也遇到过同样的问题 - 尽管几年后,有些人可能会发现一些建议很有帮助:

      不要无缘无故地使用“静态”!

      了解“静态”在运行时和编译时语义(行为)和语法方面的含义。

      • 一个静态实体会在一段时间前自动构造
        第一次使用。

      • 静态实体分配了一个存储位置,即
        由所有访问该实体的人共享。

      • 静态实体只能通过类型名访问,不能
        通过该类型的实例。

      • 静态方法没有隐含的“this”参数,与 实例方法。 (因此静态方法的执行更少
        开销——使用它们的一个原因。)

      • 考虑使用静态实体时的线程安全性。

      MSDN 中关于静态的一些细节:

      【讨论】:

        【解决方案4】:

        这会导致错误:

        MyClass aCoolObj = new MyClass();
        aCoolObj.MyCoolStaticMethod();
        

        这是解决方法:

        MyClass.MyCoolStaticMethod();
        

        解释:

        您不能从对象的实例中调用静态方法。静态方法的全部意义在于不与对象实例绑定,而是在该对象的所有实例中持续存在,和/或在没有任何对象实例的情况下使用。

        【讨论】:

          【解决方案5】:

          在这种情况下不需要使用 static ,正如彻底解释的那样。您也可以在没有 GetItem() 方法的情况下初始化您的属性,以下两者的示例:

          namespace MyNamespace
          {
              using System;
          
              public class MyType
              {
                  public string MyProperty { get; set; } = new string();
                  public static string MyStatic { get; set; } = "I'm static";
              }
          }
          

          消费:

          using MyType;
          
          public class Somewhere 
          {
              public void Consuming(){
          
                  // through instance of your type
                  var myObject = new MyType(); 
                  var alpha = myObject.MyProperty;
          
                  // through your type 
                  var beta = MyType.MyStatic;
              }
          }       
          

          【讨论】:

            【解决方案6】:

            无法通过实例引用访问

            这意味着您正在调用一个 STATIC 方法并将其传递给一个实例。最简单的解决方案是去掉静态,例如:

            public static void ExportToExcel(IEnumerable data, string sheetName) {

            【讨论】:

              【解决方案7】:

              我在这里通过(重复)问题Static member instance reference issue 搜索 C# 编译器错误 CS0176。

              就我而言,发生错误是因为我有一个同名的静态方法和一个扩展方法。为此,请参阅Static method and extension method with same name

              [也许这应该是一个评论。对不起,我还没有足够的声望。]

              【讨论】:

                【解决方案8】:

                我知道这是一个旧线程,但我只花了 3 个小时试图找出我的问题所在。我通常知道这个错误是什么意思,但你也可以用更微妙的方式遇到这个错误。我的问题是我的客户端类(从实例类调用静态方法的类)具有不同类型的属性,但名称与静态方法相同。编译器报告的错误与此处报告的相同,但问题基本上是名称冲突。

                对于遇到此错误且上述方法均无济于事的其他人,请尝试使用命名空间名称完全限定您的实例类。 ..() 以便编译器可以看到您所指的确切名称。

                【讨论】:

                • 我发现这很有帮助。我有一个名字冲突,甚至不知道。在我的方法调用之前添加命名空间后,问题就解决了。
                【解决方案9】:

                删除您尝试调用的函数中的静态。这解决了我的问题。

                【讨论】:

                  【解决方案10】:

                  检查您的代码是否包含与您的静态类名最右侧部分匹配的命名空间。

                  给定一个静态 Bar 类,定义在命名空间 Foo 上,实现方法 Jump 或属性,您可能会收到编译器错误,因为还有另一个以 Bar 结尾的命名空间。是的,鱼的东西;-)

                  如果是这样,这意味着您使用 Using Bar;Bar.Jump() 调用,因此以下解决方案之一应该满足您的需求:

                  • 使用相应的命名空间完全限定静态类名称,这会导致 Foo.Bar.Jump() 声明。您还需要删除 Using Bar; 声明
                  • 用不同的名称重命名命名空间 Bar

                  在我的例子中,在 Database.SetInitializer() 调用的 EF (Entity Framework) 存储库项目中发生了愚蠢的编译器错误:

                  Member 'Database.SetInitializer<MyDatabaseContext>(IDatabaseInitializer<MyDatabaseContext>)' cannot be accessed with an instance reference; qualify it with a type name instead MyProject.ORM
                  

                  当我添加一个 MyProject.ORM.Database 命名空间时会出现此错误,该命名空间的后缀为 (Database) ,您可能已经注意到,匹配 Database.SetInitializer 类名。

                  在此,由于我无法控制 EF 的 Database 静态类,并且我还想保留我的自定义命名空间,因此我决定使用其命名空间 System. Data.Entity,导致使用如下命令,编译成功:

                  System.Data.Entity.Database.SetInitializer<MyDatabaseContext>(MyMigrationStrategy)
                  

                  希望对你有帮助

                  【讨论】:

                    【解决方案11】:
                    YourClassName.YourStaticFieldName
                    

                    你的静态字段看起来像:

                    public class StaticExample 
                    {
                       public static double Pi = 3.14;
                    }
                    

                    从另一个类中,您可以按如下方式访问 staic 字段:

                        class Program
                        {
                         static void Main(string[] args)
                         {
                             double radius = 6;
                             double areaOfCircle = 0;
                    
                             areaOfCircle = StaticExample.Pi * radius * radius;
                             Console.WriteLine("Area = "+areaOfCircle);
                    
                             Console.ReadKey();
                         }
                      }
                    

                    【讨论】:

                    • 也许您可以将您的解决方案翻译成问题的示例,并稍微解释一下静态字段在类定义和实例方面的工作原理?
                    • 感谢您的评论,现在@Alex 怎么样?
                    猜你喜欢
                    • 1970-01-01
                    • 1970-01-01
                    • 1970-01-01
                    • 1970-01-01
                    • 1970-01-01
                    • 1970-01-01
                    • 2021-08-19
                    • 2021-11-26
                    相关资源
                    最近更新 更多