인스턴스 참조로 멤버 '<method>'에 액세스 할 수 없습니다.


195

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에서 다음과 같은 설명을 제공합니다.

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

이것이 무엇을 의미하는지 잘 모르겠습니다. 인터넷 검색을 수행했지만 알아낼 수 없었습니다.

답변:


283

C #에서는 VB.NET 및 Java와 달리 static인스턴스 구문으로 멤버에 액세스 할 수 없습니다 . 해야 할 일 :

MyClass.MyItem.Property1

해당 속성을 참조하거나 static수정자를 제거하십시오 Property1(아마도 원하는 작업입니다). 무엇이 무엇인지에 대한 개념적인 아이디어는 static다른 답변을 참조하십시오 .


45

유형 이름을 사용하여 정적 멤버에만 액세스 할 수 있습니다.

그러므로 다음 중 하나를 작성해야합니다.

MyClass.MyItem.Property1

또는 정의 Property1에서 static키워드를 제거하여 인스턴스 속성을 만드십시오 .

정적 속성은 클래스의 모든 인스턴스간에 공유되므로 하나의 값만 갖습니다. 지금 정의한대로 MyItem 클래스의 인스턴스를 만들 필요는 없습니다.


또는 "정의에서 정적 키워드를 제거하여 Property1을 인스턴스 속성으로 만듭니다." 성공의 열쇠입니다! 감사합니다
tim687

29

나는 같은 문제가 있었지만 몇 년 후에도 일부 포인터가 도움이 될 수 있습니다.

'정적'을 과도하게 사용하지 마십시오!

런타임 및 컴파일 시간 의미론 (동작) 및 구문 모두에서 '정적'이 의미하는 바를 이해하십시오.

  • 정적 엔티티는
    처음 사용 하기 얼마 전에 자동으로 생성됩니다 .

  • 정적 엔터티에는 하나의 저장소 위치가 할당되며
    해당 엔터티에 액세스하는 모든 사람 이 공유합니다.

  • 정적 엔티티는 해당 유형
    의 인스턴스가 아닌 유형 이름을 통해서만 액세스 할 수 있습니다 .

  • 정적 메소드에는 인스턴스 메소드와 마찬가지로 암시적인 'this'인수가 없습니다. (따라서 정적 메소드는 실행
    오버 헤드 가 적습니다 .이를 사용하는 이유 중 하나입니다.)

  • 정적 엔터티를 사용할 때 스레드 안전성을 고려하십시오.

MSDN의 정적에 대한 세부 정보 :


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

3

인스턴스 참조로 액세스 할 수 없습니다

그것은 당신이 STATIC 메소드를 호출하고 인스턴스를 전달한다는 것을 의미합니다. 가장 쉬운 해결책은 정적을 제거하는 것입니다. 예 :

공개 정적 무효 ExportToExcel (IEnumerable 데이터, 문자열 sheetName) {


2

나는 이것이 오래된 스레드라는 것을 알고 있지만, 단지 3 시간 동안 내 문제가 무엇인지 알아 내려고 노력했습니다. 나는 일반적 으로이 오류의 의미를 알고 있지만 더 미묘한 방법 으로이 문제를 해결할 수 있습니다. 내 문제는 내 클라이언트 클래스 (인스턴스 클래스에서 정적 메서드를 호출하는 클래스)가 다른 유형의 속성을 가지고 있지만 정적 메서드와 동일한 이름을 가졌습니다. 컴파일러가보고 한 오류는 여기보고 된 것과 동일하지만 문제는 기본적으로 이름 충돌이었습니다.

다른 사람 이이 오류를 겪고 위의 어느 것도 도움이되지 않으면 네임 스페이스 이름으로 인스턴스 클래스를 정규화하십시오. .. () 그래서 컴파일러는 당신이 의미하는 정확한 이름을 볼 수 있습니다.


나는 이것이 도움이된다는 것을 알았다. 나는 이름 충돌이 있었고 그것을 몰랐습니다. 메서드 호출 전에 네임 스페이스를 추가하자마자 문제가 해결되었습니다.
최대

1

코드에 네임 스페이스가 포함되어 있는지 확인하십시오. 대부분 네임 스페이스가 정적 클래스 이름과 일치합니다.

정적을 감안할 네임 스페이스에 정의 된 클래스, , 메소드 구현 점프 또는 속성을 가능성도에 끝나는 다른 네임 스페이스가 있기 때문에 당신이 컴파일러 오류를 받고 있습니다 . 네, 비린내 물건 ;-)

그렇다면 사용 바를 사용한다는 의미입니다 . 그리고 Bar.Jump () 다음과 같은 솔루션, 따라서 하나의 호출은, 필요에 맞게해야한다 :

  • 네임 스페이스에 따라 정적 클래스 이름을 완전히 규정하면 Foo.Bar.Jump () 선언이 발생합니다. Using Bar 도 제거해야합니다 . 성명서
  • 네임 스페이스 바의 이름을 다른 이름으로 바꿉니다 .

필자의 경우 다음 컴파일러 오류 는 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을 추가하면이 오류가 발생 합니다. 수 있듯이 접미사 ( Database ) 인 데이터베이스 네임 스페이스 는 Database .SetInitializer 클래스 이름 과 일치 합니다.

여기서는 EF의 데이터베이스 정적 클래스 에 대한 제어 권한이 없으며 사용자 정의 네임 스페이스를 유지하고 싶기 때문에 EF의 데이터베이스 정적 클래스를 namepace System.Data.Entity 로 완전히 규정하기로 결정 했으며 다음 명령을 사용했습니다. 컴파일 성공 :

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

그것이 도움이되기를 바랍니다.



1

이로 인해 오류가 발생합니다.

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

이것은 수정 사항입니다.

MyClass.MyCoolStaticMethod();

설명:

객체의 인스턴스에서 정적 메서드를 호출 할 수 없습니다. 정적 메소드의 요점은 객체의 인스턴스에 묶이지 않고 대신 해당 객체의 모든 인스턴스를 통해 지속되거나 객체의 인스턴스없이 사용되는 것입니다.


0
YourClassName.YourStaticFieldName

정적 필드의 경우 다음과 같습니다.

public class StaticExample 
{
   public static double Pi = 3.14;
}

다른 클래스에서 다음과 같이 고정 필드에 액세스 할 수 있습니다.

    class Program
    {
     static void Main(string[] args)
     {
         double radius = 6;
         double areaOfCircle = 0;

         areaOfCircle = StaticExample.Pi * radius * radius;
         Console.WriteLine("Area = "+areaOfCircle);

         Console.ReadKey();
     }
  }

아마도 솔루션을 질문의 예로 번역하고 클래스 정의 및 인스턴스와 관련하여 정적 필드가 어떻게 작동하는지에 대해 조금 설명 할 수 있습니까?
noetix 2019

귀하의 의견에 감사드립니다, 지금 @Alex는 어떻습니까?
Hedego
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.