1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
using System;  

public struct MyStruct  
{  
    public int Width;  
}  

public class ListView  
{  
    MyStruct ms;  
    public MyStruct Size  
    {  
        get { return ms; }  
        set { ms = value; }  
    }  
}  

public class MyClass  
{  
    public MyClass()  
    {  
        ListView lvi;  
        lvi = new ListView();  
        lvi.Size.Width = 5; // CS1612                                                                                  
    }  

    public static void Main()   
    {  
        MyClass mc = new MyClass();  
        // Keep the console open in debug mode.  
        Console.WriteLine("Press any key to exit.");  
        Console.ReadKey();     
    }  
}  


C++에서 C#으로 옮기면서 겪는 백만스물두 가지 정도 고통 중의 하나입니다.


보통 List 안에 구조체 변수를 넣고 돌리는 경우가 종종 있는데, 무려 C#에서는 컴파일 에러가 나는 코드입니다.



이유가 뭐인고 하니 인덱스에서 값 형식을 찾아갈때는 그 개체 자체의 참조변수가 아닌 '복사본'을 얻게 된다는 것.


이 '복사본'은 저장소 위치를 가르키는 것이 아닌 단순한 메소드이기 때문에 인덱스에 저장되진 않는다는 겁니다.


한 마디로 개체참조를 하려고 했더니 헛손가락질을 한다는 것.



'당연한 거 아니야?' 라고 한다면 그런거겠지..만 이게 익숙해진 사람들에겐 의외로 짜증나는 것이거든요 -_-;

생각보다 해결 방법은 많습니다.


1. 구조체 선언 시 접근속성 부여


2. 구조체에 고유한 인스턴스를 만들고, 해당 필드를 수정 후 다음 전체 구조체를 속성에 다시 할당하기 (2중 구조체)


3. 구조체를 클래스로 변경하기 (?)




 1
 2
 3
 4
 5
 6
 7
 8
 9
10
public MyClass()  
    {  
        //ListView lvi;  
        //lvi = new ListView();  
        //lvi.Size.Width = 5; // CS1612                                                                                

        MyStruct ms;  
        ms.Width = 5;  
        lvi.Size = ms;
    }  


그냥 재할당을 해주면 단순히 해결되긴 합니다 ~_~

+ Recent posts