C#

2012-12-18 1 views
4

을 입력 단위 리턴와 F #의 인터페이스 멤버를 구현한다고 가정 나는 F 번호에 다음과 같은 인터페이스를 정의했습니다 :C#

type IFoo<'T> = 
    abstract member DoStuff : 'T -> unit 

나는 C#에서이를 구현하면 내가 할 방법 서명이 필요합니다

public void DoStuff<T>(T arg) {...} 
에게 내가 정말로 원하는 무엇

참조 FSharp.Core하고 다음 사용 올릴 때 나는 때문에 다른 코드를 단순화 할

public Unit DoStuff<T>(T arg) {...} 

Action vs Func을 다뤄야 만합니다. 나는 이것을 달성 할 수있는 깨끗한 방법이 없다고 생각하고 있습니까? 악의적 인 해킹은 어때?

+0

그리고 C#의 불쾌한 FSharpFuncs와 C# devs의 익숙하지 않은 것을 다루겠습니까? 당신은 아마 당신 자신의 'Unit'타입을 구현하고 그것을 사용할 수 있습니다, 그러나 그것은 정말로 끔찍한 생각입니다. –

+2

위의 것들 중 어느 것도 C#에서 FSharpFuncs를 사용해야합니다. 친숙하지 않은 문제는 익숙 함으로 해결되지 않으면 해결되지 않을 것입니다. 내 자신의 유닛 유형이 끔찍한 생각 일 것이라는 데 동의한다 : RX는 이미 자체 버전을 발표했다. 세상은 또 다른 필요가 없습니다 :) – Akash

답변

4

Unit에서 void으로의 변환은 컴파일러에서 구워집니다. FSharpFuncConverter 사이의 변환을 위해 F # Core에 FuncConvert 클래스가 있습니다. Action<T>Func<T, Unit>으로 변환하는 유사한 클래스를 정의하는 것은 어떻습니까?

static class ActionConvert { 
    private static readonly Unit Unit = MakeUnit(); 

    public static Func<T, Unit> ToFunc<T>(Action<T> action) { 
     return new Func<T, Unit>(x => { action(x); return Unit; }); 
    } 

    private static Unit MakeUnit() { 
     //using reflection because ctor is internal 
     return (Unit)Activator.CreateInstance(typeof(Unit), true); 
    } 
} 

그럼 당신은 당신은 아마 심지어 Unit 인스턴스를 포기하고 대신 null을 반환 할 수

var foo = new Foo<int>(); 
var func = ActionConvert.ToFunc<int>(foo.DoStuff); 

할 수 있습니다.

+0

그 트릭을 할거야, 고마워! 인터페이스를 구현할 때 Unit을 사용하기를 원할 수도 있습니다. 나는 다른 곳에서 그것을 사용하고있다. – Akash