F # Core가 일반 배열 유형을 정의하는 이유는 무엇입니까? string []과 같은

방금 FSharp.Core 네임 스페이스에 최대 4 차원의 일반 배열 유형 (예 : Core. [] < ‘T> , Core. [,] <‘T>)이 포함되어 있음을 알았습니다 . C # 및 VB가 제대로 작동하는 것 같습니다. System.Array 사용-int [], string []과 같은 강력한 형식의 특수 배열 유형을 지원하는 방법을 잘 모르겠습니다.

나는 이것이 두 가지 질문이된다고 생각한다.

  • C #은 제네릭이 아닌 System.Array를 기반으로 int []와 같은 강력한 형식의 특수 배열 유형을 어떻게 지원합니까?
  • C #이이를 수행한다고 가정하면 F #이 일반 배열 유형을 정의하는 이유는 무엇입니까?


답변

F #은 일반 배열 유형 자체를 정의하지 않습니다. F #의 배열은 나머지 .NET에서 사용하는 배열 유형과 동일하며, 반대로 가리키는 모든 구문 적 증거에도 불구하고 일반적이지 않습니다.

이 수 때로는 역화 당신에 당신이 F #으로 반사를 사용할 때 – 당신이 경우에도 array<int>당신이 그것을 검사 할 때부터 거짓 얻을 나타나는이 완벽하게 유효한 일반적인 유형으로 IsGenericType,에서 진실을 IsArray, 당신은 유형 인수를 얻을 과 GetElementType보다는 GetGenericArguments.

Telastyn이 그의 답변에서 언급했듯이, 이것은 우리가 살아야 할 .NET 1.0의 레거시 수하물 일 것입니다. 그러나 F #에서 리플렉션 API를 사용하여 실제 광산 분야로 만드는 것은 많은 것 중 하나입니다.

F #이 정의하는 것은 [], [,] ...유형 약어 / 별칭 / 연산자 및 해당 기능이있는 모듈이지만 모두 동일한 배열 유형을 나타냅니다.

github의 소스 코드를 여기여기 에서 직접 확인할 수 있습니다.


답변

C #은 제네릭이 아닌 System.Array를 기반으로 int []와 같은 강력한 형식의 특수 배열 유형을 어떻게 지원합니까?

System.Array제네릭을 1.0에서 사용할 수 없었기 때문에 상속 된 특수 클래스를 생성함으로써 가능성이 높습니다 . 호환성을 위해 동작이 유지되었을 수 있습니다.

C #이이를 수행한다고 가정하면 F #이 일반 배열 유형을 정의하는 이유는 무엇입니까?

F #에는 C # 2.0의 기존 코드와 동일한 호환성 제약 조건이 없었기 때문입니다. 내가 아는 것을 기반으로 C # 2.0은 C #의 첫 번째 릴리스 인 경우 일반 배열 유형을 가졌을 것입니다.