我正在进入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。智能感知只给我“等于,GetHashCode, GetType,和ToString”作为选项。当我把鼠标移到oItem上时。Property1, Visual Studio给我这样的解释:

MemberMyDataLayer.Section1.MyClass.MyItem.Property1。get不能通过实例引用访问,而是用类型名限定它

我不确定这是什么意思,我用谷歌搜索了一下,但没能弄明白。


当前回答

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

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

如果是这样,这意味着你使用了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)与Database匹配。SetInitializer类名。

在这种情况下,由于我无法控制EF的数据库静态类,我也想保留我的自定义名称空间,我决定完全限定EF的数据库静态类的名称空间System.Data。实体,使用下面的命令导致编译成功:

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

希望能有所帮助

其他回答

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

我在这里谷歌c#编译器错误CS0176,通过(重复)问题静态成员实例引用问题。

在我的例子中,发生错误是因为我有一个同名的静态方法和一个扩展方法。为此,请参见同名静态方法和扩展方法。

[也许这应该是一个评论。对不起,我的名声还不够好。

不能通过实例引用访问

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

ExportToExcel(IEnumerable data, string sheetName) {

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

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

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

A static entity will be automatically constructed some time before its first use. A static entity has one storage location allocated, and that is shared by all who access that entity. A static entity can only be accessed through its type name, not through an instance of that type. A static method does not have an implicit ‘this’ argument, as does an instance method. (And therefore a static method has less execution overhead – one reason to use them.) Think about thread safety when using static entities.

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

c#中的静态类 c#中的静态构造函数

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

因此,你需要写,

MyClass.MyItem.Property1

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

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