2013-07-03 2 views
0

제 질문은 절반 문체입니다. 나는 도서관을 다시 쓰고 가능한 한 압축하려고 노력하고있다. (이 경로를 취하고하는 ByRef 변수에 값을 읽습니다.) 이전에는이처럼 보였다 :효율적인 제네릭 오버로드

Public Sub Read(ByVal name As String, ByRef values(,,) As Long)

등 등

Public Sub Read(ByVal name As String, ByRef values(,) As Integer)는 ... 이들 중 30 약이 있었다 포함 스칼라 버전. 업데이트 할 악몽.

모든 메서드에 유형 및 순위가 오버로드되었습니다. 제네릭으로이 시스템을 다시 작성하고 있지만 문제가 있습니다. 다음 방법은 컴파일되지 않습니다 :

Public Sub Read(Of T)(ByVal name as String, ByRef values As T)

Public Sub Read(Of T)(ByVal name as String, ByRef values As T())

Public Sub Read(Of T)(ByVal name as String, ByRef values As T(,))

Public Sub Read(Of T)(ByVal name as String, ByRef values As T(,,))

가 컴파일되지 않습니다 이유는 매우 분명하다; 'T'유형은 쉽게 Array로 간주 될 수 있으며 컴파일러는 첫 번째 또는 두 번째 오버로드를 선택할지 여부를 알지 못합니다. (참고 :이 시스템은 이 과부하 된 Read 메소드의 스칼라 버전이 아닌 일 경우 예상대로 작동합니다.

그래서 수수께끼가 남았습니다. 이러한 오버로드를 설계하는 가장 좋은 방법을 모르므로 최소한의 코드를 사용하면서이 라이브러리를 사용하여 기존 코드와의 호환성을 유지하십시오. (우리는 엄격하게 사내에서 사용하고 있으므로 은 내 라이브러리를 사용하여 코드를 변경할 수 있지만 가능한 한 많은 서명을 유지하는 것이 좋습니다.)

기본적으로 방법은 있습니까? 내가 보여준 것처럼 과부하를 디자인 해? 스칼라 입력에만 상위 오버로드를 사용하도록 컴파일러에 명시 적으로 말할 수 있습니까? 그렇지 않다면 최고의 디자인은 무엇입니까? 나는 모든 창조적 인 아이디어에 열려 있습니다. 당신이 시도 할 수

감사

+0

'C#'에서 문제가되지 않는 '.NET 3.5'로 컴파일하고 아무 문제없이 실행됩니다. 어쨌든 아래 답변에서와 같이하십시오. –

답변

0

것은 (당신이 경우에만 숫자 값을 사용하는 경우)에만 구조를 취할 첫 번째 오버로드를 확인하는 것입니다.

Public Sub Read(Of T As Structure)(ByVal name as String, ByRef values As T) 

배열이 구조가 아니기 때문에 과부하 선택을 할 수 있습니다.

또 다른 할 일은, 다른 이름으로 모든 배열 오버로드를 만들고 자체 이름으로 스칼라를 만드는 것입니다. 스칼라 버전에서는 T is Array인지 확인하고 치수를 계산하고 프로퍼러 배열 과부하를 호출합니다.