Tag: type constraints

接口作为类型约束和接口作为参数之间的区别?

如果我想创建一个将IList实例作为参数(或任何其他接口,但让我们使用IList作为示例)的方法,我可以创建一个带有类型约束的generics方法,例如: public static void Foo1(T list) where T : IList { } 或者,我可以创建一个直接获取IList参数的方法: public static void Foo2(IList list) { } 出于所有意图和目的,似乎这些方法的行为完全相同: List myList = new List(); Foo1(myList); Foo2(myList); 所以这是我的问题 – 这两种方法之间的区别是什么? 似乎第二种方法稍微可读; 我应该注意哪些其他差异(生成不同的IL等)? 提前致谢。

如何将`where T:U`generics类型参数约束从C#转换为F#?

F#给我带来了类型推理规则的一些麻烦。 我正在编写一个简单的计算构建器,但无法正确获取我的generics类型变量约束。 我想要的代码在C#中如下所示: class FinallyBuilder { readonly Action finallyAction; public FinallyBuilder(Action finallyAction) { this.finallyAction = finallyAction; } public TB Bind(TA x, Func cont) where TA : TZ { // ^^^^^^^^^^^^^ try // this is what gives me a headache { // in the F# version return cont(x); } finally { finallyAction(x); } } } 到目前为止,我为F#版本提出的最佳(但非编译代码)是: […]