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
이것이 무엇을 의미하는지 잘 모르겠습니다. 인터넷 검색을 수행했지만 알아낼 수 없었습니다.
답변
C #에서는 VB.NET 및 Java와 달리 static
인스턴스 구문으로 멤버에 액세스 할 수 없습니다 . 해야 할 일 :
MyClass.MyItem.Property1
해당 속성을 참조하거나 static
수정자를 제거하십시오 Property1
(아마도 원하는 작업입니다). 무엇이 무엇인지에 대한 개념적인 아이디어는 static
다른 답변을 참조하십시오 .
답변
유형 이름을 사용하여 정적 멤버에만 액세스 할 수 있습니다.
그러므로 다음 중 하나를 작성해야합니다.
MyClass.MyItem.Property1
또는 정의 Property1
에서 static
키워드를 제거하여 인스턴스 속성을 만드십시오 .
정적 속성은 클래스의 모든 인스턴스간에 공유되므로 하나의 값만 갖습니다. 지금 정의한대로 MyItem 클래스의 인스턴스를 만들 필요는 없습니다.
답변
나는 같은 문제가 있었지만 몇 년 후에도 일부 포인터가 도움이 될 수 있습니다.
‘정적’을 과도하게 사용하지 마십시오!
런타임 및 컴파일 시간 의미론 (동작) 및 구문 모두에서 ‘정적’이 의미하는 바를 이해하십시오.
-
정적 엔티티는
처음 사용 하기 얼마 전에 자동으로 생성됩니다 . -
정적 엔터티에는 하나의 저장소 위치가 할당되며
해당 엔터티에 액세스하는 모든 사람 이 공유합니다. -
정적 엔티티는 해당 유형
의 인스턴스가 아닌 유형 이름을 통해서만 액세스 할 수 있습니다 . -
정적 메소드에는 인스턴스 메소드와 마찬가지로 암시적인 ‘this’인수가 없습니다. (따라서 정적 메소드는 실행
오버 헤드 가 적습니다 .이를 사용하는 이유 중 하나입니다.) -
정적 엔터티를 사용할 때 스레드 안전성을 고려하십시오.
MSDN의 정적에 대한 세부 정보 :
답변
이 경우 철저하게 설명 된대로 정적을 사용할 필요가 없습니다. 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;
}
}
답변
인스턴스 참조로 액세스 할 수 없습니다
그것은 당신이 STATIC 메소드를 호출하고 인스턴스를 전달한다는 것을 의미합니다. 가장 쉬운 해결책은 정적을 제거하는 것입니다. 예 :
공개 정적 무효 ExportToExcel (IEnumerable 데이터, 문자열 sheetName) {
답변
나는 이것이 오래된 스레드라는 것을 알고 있지만, 단지 3 시간 동안 내 문제가 무엇인지 알아 내려고 노력했습니다. 나는 일반적 으로이 오류의 의미를 알고 있지만 더 미묘한 방법 으로이 문제를 해결할 수 있습니다. 내 문제는 내 클라이언트 클래스 (인스턴스 클래스에서 정적 메서드를 호출하는 클래스)가 다른 유형의 속성을 가지고 있지만 정적 메서드와 동일한 이름을 가졌습니다. 컴파일러가보고 한 오류는 여기보고 된 것과 동일하지만 문제는 기본적으로 이름 충돌이었습니다.
다른 사람 이이 오류를 겪고 위의 어느 것도 도움이되지 않으면 네임 스페이스 이름으로 인스턴스 클래스를 정규화하십시오. .. () 그래서 컴파일러는 당신이 의미하는 정확한 이름을 볼 수 있습니다.
답변
코드에 네임 스페이스가 포함되어 있는지 확인하십시오. 대부분 네임 스페이스가 정적 클래스 이름과 일치합니다.
정적을 감안할 바 네임 스페이스에 정의 된 클래스, 푸 , 메소드 구현 점프 또는 속성을 가능성도에 끝나는 다른 네임 스페이스가 있기 때문에 당신이 컴파일러 오류를 받고 있습니다 바 . 네, 비린내 물건 😉
그렇다면 사용 바를 사용한다는 의미입니다 . 그리고 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)
그것이 도움이되기를 바랍니다.
