繁体   English   中英

成员 &#39;<member name> &#39; 不能用实例引用访问

[英]Member '<member name>' cannot be accessed with an instance reference

我正在使用 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 给出了以下解释:

Member MyDataLayer.Section1.MyClass.MyItem.Property1.get cannot be accessed with an instance reference, qualify it with a type name instead

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

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

MyClass.MyItem.Property1

引用该属性或从Property1删除static修饰符(这可能是您想要做的)。 有关什么是static的概念性想法,请参阅我的其他答案

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

因此,你需要要么写,

MyClass.MyItem.Property1

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

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

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

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

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

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

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

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

  • 静态方法不像实例方法那样具有隐式的“this”参数。 (因此静态方法的执行较少
    开销——使用它们的一个原因。)

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

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

在这种情况下不需要使用静态,正如彻底解释的那样。 您也可以在没有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;
    }
}       

这会导致错误:

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

这是修复:

MyClass.MyCoolStaticMethod();

解释:

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

不能通过实例引用访问

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

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

我在谷歌上搜索 C# 编译器错误 CS0176,通过(重复)问题静态成员实例引用问题

就我而言,发生错误是因为我有一个静态方法和一个同名的扩展方法。 为此,请参阅具有相同名称的静态方法和扩展方法

[也许这应该是评论。 抱歉,我还没有足够的声望。]

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

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

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

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

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

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

就我而言,在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时会出现此错误 您可能已经注意到,数据库命名空间的后缀 ( Database ) 与Database .SetInitializer类名匹配。

在这方面,由于我无法控制 EF 的数据库静态类,而且我还想保留我的自定义命名空间,因此我决定使用其命名空间System.Data.Entity完全限定 EF 的数据库静态类,这导致使用以下命令,编译成功:

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

希望能帮助到你

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

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

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM