2011-03-30 3 views
0

나는 VS2010에 대한 간단한 예제가 있습니다.추상 클래스 컴파일러 오류

+0

어떤 컴파일러 오류가 발생합니까? –

+0

"비 정적 필드, 메소드 또는 속성 'ConsoleApplication1.Program.MyMethod (ref ConsoleApplication1.AbsClass)'에 대해 객체 참조가 필요합니다."- 좀 이상하지 않습니까? –

+0

@ Femaref의 대답은 정확합니다. 주석 처리 된 버전 (ConClass 사용)이 작동하지 않는 이유는 ref 매개 변수에 인수로 전달 된 변수의 유형이 해당 매개 변수의 유형과 정확히 일치해야한다는 것입니다. 이렇게하면 메서드의 모든 할당이 제대로 작동합니다. –

답변

4

당신은 당신의 MyMethod 고정 할 필요가 :

public static void MyMethod(ref AbsClass a) 
    { 
     a.Id = "new"; 
    } 

문제는 추상 클래스 아니다은 "문제는"정적 Main 방법이다. 정적 메서드에는 인스턴스가 없으므로 인스턴스 메서드를 호출 할 수 없습니다.

msdn on static classes and static members. , 양호하게는

public static MyMethod(ref AbsClass a) 
{ 
    a.Id = "new"; 
} 

또는를 Program 클래스의 인스턴스를 생성하고 해당 인스턴스에서 MyMethod 전화 :

+0

네, 맞아요. 이제 정적으로 실행됩니다. 하지만 왜? 아니면, 공식 문서에 대한 링크가 있습니다. – ferpega

+0

죄송합니다 ... 코드 아래에 귀하의 의견을 보지 못했습니다. 당신은 내가 아닌 기본 정적 메서드를 원래의 코드를 잘 실행됩니다 넣어 의미합니까? – ferpega

+0

링크를 추가했지만 요약하면 이유는 이미 게시물에 나와 있습니다. 'Main' 메쏘드는'static'이며,'Program' 클래스의 특정 인스턴스와 관련이 없습니다. 그 결과,'Program'의 인스턴스에 의존하지 않는 다른 메소드 만 호출 할 수 있습니다. – Femaref

0

당신에게 중 하나는 MyMethod 방법은 정적해야

Program p = new Program(); 
p.MyMethod(ref abs); 

이유 왜 첫 번째 방법은 Main 메서드가 static으로 표시되어 Program 클래스의 인스턴스에 연결되어 있지 않기 때문에 작동합니다. .NET Framework CLR은 String 배열을 사용하는 정적 메서드 인 Main을 어셈블리를 통해 검색하고 해당 함수를 진입 점으로 만듭니다. 많은 자습서와 심지어 MSDN 코드 샘플도 Program 클래스에 static 키워드로 표시되어 있습니다. 클래스의 모든 메서드가 정적 메서드 만 포함하는 경우 모범 사례로 간주됩니다.

두 번째 방법은 작동하고,이 방법을 선호하는 이유 당신이 인스턴스 메소드MyMethod를 정의하기 때문입니다 이유. 기본적으로 인스턴스 메소드를 실행하려면 객체의 인스턴스가 필요합니다. new 키워드는 지정된 유형의 인스턴스를 만듭니다. 정적 메소드는 객체의 인스턴스없이 호출 될 수 있지만 정적이 아닌 인스턴스 멤버 (속성, 개인/공용 변수 등)에도 액세스 할 수 없습니다. 일반적으로 유틸리티 클래스를 구현하거나 확장 메서드를 사용하거나 도우미 메서드를 제공해야하는 경우가 아니면 정적 메서드 및 클래스를 사용하지 않으려합니다.