2016-11-28 11 views
10

에서 지정된 메소드를 제기 F #으로 사용이 지원되지 않는 예외 내가 사용하는 F에 #이 일반적인 기능을 가지고 C 번호 :연산자 (- -)() 연산자 C#

Unhandled Exception: System.NotSupportedException: Specified method is not supported. at ProjA.MainClass.Main (System.String[] args) [0x00000] in <4f209fa43741462db3b8f73ac83c35a2>:0 [ERROR] FATAL UNHANDLED EXCEPTION: System.NotSupportedException: Specified method is not supported. at ProjA.MainClass.Main (System.String[] args) [0x00000] in <4f209fa43741462db3b8f73ac83c35a2>:0

:

int a = sub<int, int, int>(4, 1);

이 오류가 발생합니다

이것은 (+) 연산자 또는 인라인 키워드 없이는 잘 작동합니다.

1) 잘못된 것이 있습니까? 아니면 버그입니까?

2)이 문제를 극복 할 수있는 방법이 있습니까? (하지만이 함수를 일반화하려면 인라인 키워드가 필요합니까?)

3) C#에서 f # 함수를 호출 할 때 비슷한 점이 있었습니까? 어떻게 해결 했습니까?

macOS Sierra에서 Mono 4.8을 사용하고 있습니다.

+0

@EJoshuaS 컴파일러는 반환 형식에 대해 마지막 세 가지 매개 변수를 적용합니다. 형식 인수는 컴파일러에서 자동으로 유추 할 수 없습니다. 앞에서 언급했듯이 이상한 일은 예외없이 (-)을 (+)로 변경하면 모든 것이 올바르게 작동한다는 것입니다. – mateuszlewko

+0

예, 이전 코멘트를 무시하십시오. 한번 시도한 것을 보았습니다. 나는 그런 종류의 행동 (나는 나의 기계에서 똑같은 것을 보았다)에 조금 놀랐다. 분명히 "인라인"키워드는 [약간 이상 할 수 있습니다] (http://stackoverflow.com/questions/4413324/how-does-f-inline-work) C#에서 F #로 호출 할 때 - 사실, 제거하면 인라인 함수는 올바르게 동작하지만, 왜 이것이 "+"가 아닌 "-"에서 작동하는지에 대해 다소 당혹 스럽다. 나는 실제로 누군가가 알고있는 경우에 이것이 왜인지에 대한 설명을 실제로보고 싶습니다. – EJoshuaS

+1

이것도 작동한다는 것에 놀랄 것입니다. + 당신이 +를 사용한다면 당신이 뭔가 다른 것에 대한 정의를 숨길 것이라고 의심합니다. 인라인의 경우 F # 컴파일러는 실제로 함수를 만들지 않고 사용할 수있는 메타 데이터 만 만듭니다.C# 컴파일러가이 코드를 전혀 볼 수 없다는 사실은 놀랍습니다. –

답변

7

일반적으로 inline으로 선언 된 함수는 다른 언어에서 사용할 수 없으며 (또는 F #에서와 동일하게 작동하지 않습니다.) C# 및 다른 CLR 언어에서 지원되지 않는 F # 컴파일러의 기능으로 호출 사이트에서 대체됩니다. 이것은 다른 언어에 비해 F #의 중요한 이점입니다.

그러나 예외가 있습니다. 런타임 형식을 기반으로 디스패치를 ​​수행하는 F # 인라인 함수를 작성할 수 있으며, C# 및 다른 언어에서 사용할 수 있습니다. 일반적으로 C#에서 사용할 때 F # 에서처럼 특정 형식 (기본 형식의 특정 처리기는 처리되지 않음)에서 사용되는 경우 동일한 IL을 갖지 않습니다. 이것은 (+)이 작동하는 이유입니다. this in the code for the operator을 볼 수 있습니다. 여기에서 (+)은 입니다. (-)is missing the runtime dispatched version에 명시되어 있고 명시 적으로 [<NoDynamicInvocation>]으로 표시되어 있기 때문에 C#에서 작동하지 않습니다.

이것은 사실 수십 년 동안 사람들이 IArithmetic (* Connect에 숨겨져 있기 때문에 인터넷 아카이브를 사용하여) 같은 것을 요청하게하는 C#의 동일한 제한 사항입니다. F #은 statically resolved type parameters을 통해 작동하지만 F #과 관련된 기능이며 C# 및 다른 언어에서는 작동하지 않습니다. F #을 통해 함수를 래핑하면 C#에서 해당 함수를 사용할 수 없습니다.