2011-01-02 4 views
3

클래스와 메소드를 생성하려고합니다. C# 및 VB의 경우 CodeDom 공급자는 예측 가능한 출력을 내 보냅니다. 그러나 F # CodeDom 공급자는 다음을 내 보냅니다. 이유가 궁금합니다. 예외 물건을 (내가 공급자가 아직 약간의 버그 것 같다) 무시F # CodeDom의 혼란스러운 구현

exception ReturnException8abef2fbb2404165b4b8690157bd3a49 of obj 
exception ReturnNoneException8abef2fbb2404165b4b8690157bd3a49 

type 
    // Hello 

    test = class 
     new() as this = 
      { 
      } 
     abstract my_method : unit -> unit 
     default this.my_method () = 
      () 
    end 

, 나는 내가 new() as this, 추상적 인 방법 및 기본 구현과 같은 이상한 정의를 얻을 이유에 궁금 하군요. 내가 여기서 뭔가를 놓치고 있니?

+0

내가 묻는 많은 질문이 유용한 답변을 얻지 못하는 것은 내 잘못이 아니 었습니다. –

답변

4

CodeDOM 생성기에서 생성 된 코드는 이상하지만 컴파일하는 데 주로 유효한 F # 코드입니다. kvb가 지적했듯이, 생성자의 정의는 유효합니다. CodeDOM 공급자가 암시 적 구문을 사용하여 코드를 생성하면 좋지만 여러 생성자가있는 경우에는 제대로 작동하지 않습니다.

예외 사항은 명령문 return (C#에서와 같이)을 흉내 내기 위해 사용됩니다. 예를 들어, 직접 F #으로 다음을 쓸 수 없습니다 :

for(int i = 0; i < 10; i++) 
    if (i == 5) return; 

는 그래서 CodeDOM을 생성기는 return를 에뮬레이션 예외를 사용하고 try .. with 그것을 처리 할 수 ​​있습니다.

F #의 일반적인 코딩 스타일은 C#/VB와 약간 다르며 CodeDOM 데이터 구조는 주로 C#/VB 용으로 설계되었습니다. 멋진 F # 코드를 생성하려면 직접 코드 생성기를 작성하는 것이 더 좋은 방법 일 수 있습니다. 또는 누군가가 모든 기능을 지원하지는 않지만 좋은 코드를 생성하는 F # CodeDOM 공급자를 만들 수 있습니다.

+0

Microsoft의 언어 팀 (누군가 잊었습니다)의 누군가와 인터뷰 한 것을 기억합니다. 그는 CodeDOM에 대해 질문을 받았을 때 "CodeDOM은 * 모든 프로그래밍 언어를 나타낼 수 있습니다. 프로그래밍 언어가 C# 또는 VB.NET 인 경우에만 가능하지만 어쨌든 동일한 언어입니다." 표현식 트리, F # 인용문 또는 사용자 지정 AST를 사용하고 사용자 지정 코드 생성기를 작성하는 것은 아마도 방법 일 것입니다. –

+0

그러나 추상적 인 방법에 관해서 - 우리는 정말로 그것을 필요로합니까? 내 말은, 메소드를 가질 수는 없다는 것입니다. '멤버 this.myMethod ='또는 그런 효과가 있습니까? –

+0

@Dmitri : CodeDOM에서 추상 메서드가 어떻게 작동 하는지를 기억하는지 잘 모르겠습니다. 어쨌든, 컴파일해야한다면, 메소드는 abstract (기본 구현으로)이어야한다. 왜냐하면 트리가 그것을 오버라이드하는 다른 클래스를 포함 할 수 있기 때문이다 (단지'member x.MyMethod ..'와 함께 작동하지 않을 것이다). C#에서 이런 식으로 작동합니다. CodeDOM에서 메서드가 비가 상임을 지정하는 방법이 있는지 확실하지 않습니다. –

3

이것은 나에게 잘 들립니다.

new() as this = {} 

은 빈 기본 생성자, 당신은 (section 8.14.2 of the spec 참조) F #에서 가상 메소드를 정의하는 방법을 디폴트의 구현와 추상적 인 방법이다.