成员'<method>'不能用实例引用访问
我正在进入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只给了我“ Equals
, GetHashCode
, GetType
和ToString
”作为选项。 当我把鼠标放在oItem.Property1
,Visual Studio给了我这个解释:
Member
MyDataLayer.Section1.MyClass.MyItem.Property1.getcannot be accessed with an instance reference, qualify it with a type name instead
我不确定这是什么意思,我做了一些Googlesearch,但无法弄清楚。
在C#中,与VB.NET和Java不同,您无法使用实例语法访问static
成员。 你应该做:
MyClass.MyItem.Property1
来引用该属性或从Property1
删除static
修饰符(这是你可能想要做的)。 有关static
是什么的概念,请参阅我的其他答案 。
您只能使用types的名称访问静态成员。
所以,你需要写,
MyClass.MyItem.Property1
或者(这可能是你需要做的)通过从定义中除去static
关键字来使Property1
成为一个实例属性。
静态属性在其类的所有实例之间共享,以便它们只有一个值。 现在定义它的方式,在MyItem类的任何实例中都没有任何意义。
我有同样的问题 – 虽然几年后,有些人可能会发现一些有用的指标:
不要使用'静态'免费!
从运行时和编译时语义(行为)和语法两方面理解“静态”意味着什么。
-
静态实体会在一段时间之前自动构build
它的第一次使用。 -
一个静态实体有一个存储位置分配,那就是
所有访问该实体的人共享。 -
一个静态实体只能通过它的types名来访问,而不能
通过这种types的实例。 -
静态方法没有隐含的“this”参数,就像实例方法一样。 (因此,静态方法执行较less
开销 – 使用它们的一个原因。) -
考虑使用静态实体时的线程安全性。
有关MSDN中静态的一些细节:
- C#中的静态类
- C#中的静态构造函数
不能用实例引用访问
这意味着你正在调用一个STATIC方法并将它传递给一个实例。 最简单的解决scheme是删除静态,例如:
公共静态无效ExportToExcel(IEnumerable数据,stringsheetName){
检查您的代码是否包含最右侧部分与您的静态类名称匹配的名称空间。
假设在命名空间Foo上定义了一个静态的Bar类,实现了一个方法Jump或一个属性,那么你可能会收到编译器错误,因为Bar上还有另外一个命名空间。 是的,fishi的东西;-)
如果是这样,这意味着你使用了一个使用栏; 和Bar.Jump()调用,因此以下解决scheme之一应该适合您的需求:
- 用相应的名称空间完全限定静态类名,这会导致Foo.Bar.Jump()声明。 您还需要删除使用栏; 声明
- 以diffente名称重命名命名空间栏 。
在我的情况下,在Database.SetInitializer()调用的EF ( entity 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。 数据库命名空间,正如您可能注意到的那样, sufix ( Database )与Database .SetInitializer类名称匹配。
在这里,因为我没有EF的数据库静态类的控制,我也想保留我的自定义命名空间,我决定完全限定EF的数据库静态类与它的命名空间System.Data.Entity ,导致使用以下命令编译成功:
System.Data.Entity.Database.SetInitializer<MyDatabaseContext>(MyMigrationStrategy)
希望能帮助到你
我在这里使用GooglesearchC#编译器错误CS0176,通过(重复)问题静态成员实例引用问题 。
在我的情况下,错误发生是因为我有一个静态方法和一个名字相同的扩展方法。 为此,请参阅具有相同名称的静态方法和扩展方法 。
[也许这应该是一个评论。 对不起,我还没有足够的声望呢。]
我知道这是一个古老的线索,但我花了3个小时试图找出我的问题是什么。 我通常知道这个错误是什么意思,但是你也可以用更微妙的方式来解决这个问题。 我的问题是我的客户端类(从一个实例类调用静态方法)有一个不同types的属性,但与静态方法命名相同。 编译器报告的错误与此处报告的相同,但问题基本上是名称冲突。
对于其他人得到这个错误,以上都没有帮助,请尝试完全使用命名空间名称来限定您的实例类。 ..()所以编译器可以看到你的确切名字。