F#2.0中的错误wrt到泛型类型参数的约束?

时间:2012-08-20 15:25:39

标签: c# generics f# c#-to-f# f#-3.0

如果我有一个C#方法,我想从F#中使用它并接收两个类似的参数:

public class Foo
{
    public static void GenericMethodWithTwoTypeParamsThatHaveAWhereClass<TA, TB>() where TA : TB
    {

    }
}

当我尝试通过F#调用它时,编译器会抱怨:

Foo.GenericMethodWithTwoTypeParamsThatHaveAWhereClass<System.IO.BinaryWriter, System.IDisposable>()

那么,这是F#2.0中的一个错误吗?

1 个答案:

答案 0 :(得分:2)

F#不支持此类约束。 spec表示t1 :> t2形式的约束被视为t1 = t2,这解释了您的错误:

  

此表达式应具有类型BinaryWriter,但此处具有类型System.IDisposable

根据TB的使用方式,您可以使用

GenericMethodWithTwoTypeParamsThatHaveAWhereClass<BinaryWriter, _>()
根据上述规则,

TB将被推断为BinaryWriter。但是,如果可行,那么您的C#方法可能会使用一种类型的参数。