成员'<method>'不能通过实例引用进行访问


195

我正在使用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。智能感知只给我“ ,和”作为选项。当我将鼠标悬停在时,Visual Studio给出了以下解释:EqualsGetHashCodeGetTypeToStringoItem.Property1

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

我不确定这是什么意思,我做了一些谷歌搜索,但无法弄清楚。

Answers:



45

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

因此,您需要写,

MyClass.MyItem.Property1

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

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


这“或者(可能是您需要做的)通过从其定义中删除static关键字,使Property1成为实例属性。” 是成功的关键!谢谢
tim687 2014年

29

我遇到了同样的问题-尽管几年后,有些人可能会发现一些有用的建议:

不要随意使用“静态”!

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

  • 静态实体会在
    首次使用之前的某个时间自动构建。

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

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

  • 静态方法没有实例方法的隐式“ this”参数。(因此,静态方法的执行
    开销较小,这是使用它们的原因之一。)

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

有关MSDN中static的一些详细信息:


4

在这种情况下,无需使用静态方法(如前所述)。您也可以不使用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;
    }
}       

3

无法使用实例引用进行访问

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

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


2

我知道这是一个旧线程,但是我只花了3个小时来弄清楚我的问题所在。我通常知道此错误的含义,但是您也可以以更细微的方式遇到此错误。我的问题是我的客户端类(从实例类调用静态方法的客户端类)具有不同类型的属性,但其名称与静态方法相同。编译器报告的错误与此处报告的错误相同,但问题基本上是名称冲突。

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


我发现这很有帮助。我发生了名字冲突,甚至都不知道。一旦在我的方法调用之前添加了名称空间,问题就解决了。
最多

1

检查您的代码是否包含最右边与您的静态类名称匹配的名称空间。

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

如果是这样,则意味着您正在使用“ 使用栏”;Bar.Jump()调用,因此以下解决方案之一应符合您的需求:

  • 使用namepace完全限定静态类名称,这将在Foo.Bar.Jump()声明中得出。您还需要删除“ 使用栏”;声明
  • 用不同的名称重命名命名空间Bar

在我的情况下,在Database.SetInitializer()调用的EFEntity 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时,会引起此错误您可能会注意到,sufixDatabase)的数据库名称空间与Database .SetInitializer类名匹配。

在这种情况下,由于我无法控制EF的Database静态类,并且我也想保留自己的自定义名称空间,因此我决定使用其namepace System.Data.Entity来完全限定EF的Database静态类,这导致使用以下命令,编译成功:

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

希望能帮助到你



1

这会导致错误:

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

解决方法是:

MyClass.MyCoolStaticMethod();

说明:

您不能从对象的实例调用静态方法。静态方法的重点不在于对象的实例,而在于在对象的所有实例中持久存在,和/或在没有对象的任何实例的情况下使用。


0
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();
     }
  }

也许您可以将解决方案转换为问题的示例,并就类定义和实例的静态字段如何工作进行一些解释?
noetix

谢谢您的评论,@ Alex现在呢?
Hedego '19
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.