无法使用实例引用访问成员"<method>"

And*_*ers 175 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;
            }
        }
     }
 }
Run Code Online (Sandbox Code Playgroud)

我在UserControl上有这个代码:

using MyDataLayer.Section1;

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

一切正常,除非我去访问Property1.智能感知只给我" ,和"作为选项.当我将鼠标移到上面时,Visual Studio给出了这样的解释:EqualsGetHashCodeGetTypeToStringoItem.Property1

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

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

Meh*_*ari 253

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

MyClass.MyItem.Property1
Run Code Online (Sandbox Code Playgroud)

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


SLa*_*aks 40

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

因此,你需要写,

MyClass.MyItem.Property1
Run Code Online (Sandbox Code Playgroud)

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

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


Car*_*rlH 26

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

不要无偿使用'静态'!

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

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

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

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

  • 静态方法没有隐式的'this'参数,实例方法也是如此.(因此静态方法具有较少的执行
    开销 - 使用它们的一个原因.)

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

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


Ala*_*lan 5

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

namespace MyNamespace
{
    using System;

    public class MyType
    {
        public string MyProperty { get; set; } = new string();
        public static string MyStatic { get; set; } = "I'm static";
    }
}
Run Code Online (Sandbox Code Playgroud)

消费:

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;
    }
}       
Run Code Online (Sandbox Code Playgroud)


And*_*rew 5

这会导致错误:

MyClass aCoolObj = new MyClass();
aCoolObj.MyCoolStaticMethod();
Run Code Online (Sandbox Code Playgroud)

这是修复:

MyClass.MyCoolStaticMethod();
Run Code Online (Sandbox Code Playgroud)

解释:

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