无法使用实例引用</method>访问成员“<method>”

时间:2009-07-08 19:11:17

标签: c# asp.net

我正在进入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。 intellisense只给我“EqualsGetHashCodeGetTypeToString”作为选项。当我将鼠标悬停在oItem.Property1上时,Visual Studio会给出这样的解释:

  

Member {MyDataLayer.Section1.MyClass.MyItem.Property1.get {1}}

我不确定这意味着什么,我做了一些谷歌搜索,但无法弄明白。

10 个答案:

答案 0 :(得分:239)

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

MyClass.MyItem.Property1

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

的概念

答案 1 :(得分:38)

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

因此,你需要写,

MyClass.MyItem.Property1

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

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

答案 2 :(得分:26)

我遇到了同样的问题 - 虽然几年之后,有些人可能会发现一些有用的指示:

不要无偿使用'静态'!

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

  • 静态实体将在之前的某个时间自动构建 它的第一次使用。

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

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

  • 静态方法没有隐含的'this'参数,一样 实例方法。 (因此静态方法执行较少 开销 - 使用它们的一个原因。)

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

MSDN中静态的一些细节:

答案 3 :(得分: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;
    }
}       

答案 4 :(得分:3)

  无法使用实例引用

访问

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

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

答案 5 :(得分:1)

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

鉴于在命名空间 Foo 上定义的静态 Bar 类,实现方法跳转或属性,您可能正在接收编译器错误,因为还有另一个名称空间以结尾。是的,fishi的东西; - )

如果是这样,则表示您使用使用栏; Bar.Jump()调用,因此以下解决方案之一应适合你的需求:

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

在我的情况下,在 Database.SetInitializer()调用上的 EF 实体框架)存储库项目中发生了以下编译器错误:

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

当我添加 MyProject.ORM。数据库 命名空间时,会出现此错误,该命名空间为( 数据库 )您可能会注意到,匹配 数据库 .SetInitializer 类名。

在此,由于我无法控制EF的数据库静态类,我还想保留自定义命名空间,因此我决定完全符合EF的数据库静态类使用其名称空间 System.Data.Entity ,结果使用以下命令,编译成功:

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

希望有所帮助

答案 6 :(得分:1)

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

在我的情况下,错误发生是因为我有一个静态方法和一个具有相同名称的扩展方法。为此,请参阅Static method and extension method with same name

[可能这应该是评论。抱歉,我还没有足够的声誉。]

答案 7 :(得分:1)

我知道这是一个老线程,但我花了3个小时试图弄清楚我的问题是什么。我通常知道这个错误意味着什么,但你也可以用更微妙的方式来解决这个问题。我的问题是我的客户端类(从实例类调用静态方法)具有不同类型的属性,但命名与静态方法相同。编译器报告的错误与此处报告的相同,但问题基本上是名称冲突。

对于其他任何人都会收到此错误并且没有上述帮助,请尝试使用命名空间名称完全限定您的实例类。 ..()所以编译器可以看到你的意思。

答案 8 :(得分: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();
     }
  }

答案 9 :(得分:0)

这会导致错误:

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

这是解决方法:

MyClass.MyCoolStaticMethod();

说明:

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

相关问题