这与这个问题有关。
我想创建一个通用包装类:
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;
}
}
现在假设一个具体的 Wrapper:
public class MyIntWrapper : Wrapper<int>
{
public override string ToString()
{
return "I am wrapping an integer with value " + Wrapped;
}
}
我想这样调用Wrap
扩展:
MyIntWrapper wrapped = 42.Wrap<MyIntWrapper>();
这是不可能的,因为在 c# 中我们需要为Wrap
扩展提供两个类型参数。(全有或全无)
显然,在 F# 中可以进行部分推理。
上面的代码在 F# 中的外观如何?
是否可以从 C# 中使用它?