2012-07-03 5 views
2

지금까지 항상이 사이트의 기존 게시물에서 답변을 얻을 수 있었지만 오늘은 누구도 질문하기 전에 아무도 묻지 않습니다. 코드의 후속 작품에 대한일반 클래스의 배열 및 인덱서

그것 :

class Board<T> 
{ 
    private T[,] board; 

    public T[,] BoardArray 
    { 
     get { return (T[,])board.Clone(); } 
    } 

    public T this[int y, int x] 
    { 
     get { return board[y, x]; } 
     set { board[y, x] = value; } 
    } 

    public Board() 
    { 
     board = new T[8, 8]; 
    } 

    public void AssignToBoard() 
    { 
     board[1, 2] = 3; 
     this[1, 2] = 3; 
    } 
} 

문제는 방법의 코드 두 줄이 동일한 컴파일시 오류가 발생한다는 것입니다. 오류가 발생하는 이유는 알지만 깨끗한 해결 방법을 모릅니다. 그것은 여전히 ​​더러운 솔루션입니다

board[1, 2] = (T)(object)3; 
this[1, 2] = (T)(object)3; 

가 작동하지만 :

Error 1 Cannot implicitly convert type 'int' to 'T' C:\Users\Peter\Desktop\Dropbox\ReversieAI\ReversieAI\ReversieAI\Map.cs 31 18 ReversieAI 

내 코드는 컴파일 얻을 내가 할 수 있었던 유일한 방법은에 라인을 변경하는 것입니다 : 이 오류입니다 . 여러분 중 누구라도 문제를 인식하고 어떤 생각을 나눌 수 있도록 도와 줄 수 있습니까? 사전에

감사합니다, 피터

편집 : 나는 클래스의 일반적인 부분을 제거 내 아키텍처에 뭔가를 변경하여 해결책을 발견했다. 모든 의견을 보내 주셔서 감사합니다. 정말 감사.

+0

알고 계시 겠지만, 귀하의 보드는 일반적인 유형으로 만드는 이유보다 int [,] 유형이 될 것입니다. –

+0

사이드 노트 : BoardArray 속성은 속성에 특별한 성능 특성을 가지고 있습니다 - 큰 데이터 청크를 만듭니다. "간단한 속성을 호출하고 지금 내 프로그램이 크롤링"하는 것을 피하기 위해 함수로 변경하는 것이 좋습니다. –

+0

@AlexeiLevenkov 귀하의 요지를 이해하지만 복사본을 반환하지 않으면 리턴 된 배열에 대한 변경 사항도 필드 자체에 반영되며 이는 피하고자하는 것입니다. – Jupiter

답변

1

AssignToBoard는 일반적이지 않지만 보드는 있습니다.

테스트 기능으로 보드 밖으로 옮기고 싶습니까? 그렇다면 이사회를 만들고 그것을 사용하면 모든 것이 잘될 것입니다.

당신은 문제가 AssignToBoard 방법 당신이 TT의 포함 된 배열에 정수를 넣어하여 int이라고 가정하는 것 같다

public void AssignToBoard() 
{ 
    Board<int> testBoard = new Board<int>(); 
    testBoard[1, 2] = 3; 
} 
3

같은 AssignToBoard을 사용, 테스트하려면. 이 당신이 할당되고 올바른 유형 (T)의 값을 전달하는에서

public void AssignToBoard(T value) 
{ 
    board[1, 2] = value; 
    this[1, 2] = value; 
} 

:

나는 일반적으로 뭔가를 기대하는 것이다. 그런 다음 뭔가를 할 수

는 다른 곳에서 같은 : 추가로

var myboard = new Board<int>(); 
myboard.AssignToBoard(3); 

(T)(object)3 T 문자열 같은 경우 런타임에 실패 할 가능성이 높습니다를 사용하는 솔루션을 기록하고 그것을 실행에 변환 할 수 없습니다. 당신은 정말로 컴파일 시간에서 런타임까지 모든 문제를 푸시하고 있습니다 ...