これはこの質問に関連しています。
ジェネリック ラッパー クラスを作成したい:
public abstract class Wrapper<T>
{
internal protected T Wrapped { get; set; }
}
次の拡張子を使用します。
public static class WrapperExtensions
{
public static W Wrap<W,T>(this T wrapped) where W:Wrapper<T>,new()
{
return new W {Wrapped = wrapped};
}
public static T Unwrap<T>(this Wrapper<T> w)
{
return w.Wrapped;
}
}
ここで、具体的なラッパーを想定します。
public class MyIntWrapper : Wrapper<int>
{
public override string ToString()
{
return "I am wrapping an integer with value " + Wrapped;
}
}
Wrap
次のように拡張機能を呼び出したいと思います。
MyIntWrapper wrapped = 42.Wrap<MyIntWrapper>();
Wrap
C# では両方の型引数を拡張機能に提供する必要があるため、これは不可能です。(オールオアナッシングです)
どうやら、F# では部分的な推論が可能です。
上記のコードは F# ではどのように見えるでしょうか?
C#から使えますか?