인스턴스 참조로 멤버 '<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.