Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/306.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Generics F#中是否可以内联和重写?有哪些替代方案?_Generics_F# - Fatal编程技术网

Generics F#中是否可以内联和重写?有哪些替代方案?

Generics F#中是否可以内联和重写?有哪些替代方案?,generics,f#,Generics,F#,假设我有一个这样的通用记录结构: [] 输入容器字符串)>= { 项目:'t } 具有 成员内联this.ToString()= sprintf“(%s)”(this.Item.ToString()) 这给出了一个警告: 此新成员隐藏抽象成员“System.Object.ToString():string”。重命名成员或改用“覆盖” 但是如果我切换到覆盖,我会得到一个错误: [] 输入容器字符串)>= { 项目:'t } 具有 重写内联this.ToString()= sprintf“(%s)

假设我有一个这样的通用记录结构:

[]
输入容器字符串)>=
{
项目:'t
}
具有
成员内联this.ToString()=
sprintf“(%s)”(this.Item.ToString())
这给出了一个警告:

此新成员隐藏抽象成员“System.Object.ToString():string”。重命名成员或改用“覆盖”

但是如果我切换到
覆盖
,我会得到一个错误:

[]
输入容器字符串)>=
{
项目:'t
}
具有
重写内联this.ToString()=
sprintf“(%s)”(this.Item.ToString())
此成员、函数或值声明不能声明为“内联”

如果删除
内联
,则会出现新错误:

[]
输入容器字符串)>=
{
项目:'t
}
具有
成员this.ToString()=
sprintf“(%s)”(this.Item.ToString())
这段代码不够通用。无法泛化类型变量^t when ^t:(成员到字符串:^t->string),因为它将脱离其作用域


我应该如何在F#?

中实现这一点您不能在同一个成员上使用override和inline,因为override需要方法“to exist”来重写CLR中的基类

也就是说,您可以通过使用
%O
来简化此过程:

[<Struct>]
type Container<'t> =
  {
    Item : 't
  }
  with
    override this.ToString () =
      sprintf "(%O)" this.Item
[]

键入带有警告的ContainerLive?@RobertHarvey我想我可以,尽管我希望在没有警告的情况下这是可能的,但似乎提供了对这些错误的一些见解。为什么需要
成员ToString:Unit->string
约束?不管怎样,每个对象都有这样的方法。@FyodorSoikin你说得对。我是围绕着这个错误进行实验的,我不认为这会有什么不同,为什么这会起作用?让
ToString
的约束不总是得到满足吗?@sdgfsdh通用方法约束是静态解决的,并且只适用于内联。您不能内联,因此会出现错误。它总是在没有约束的情况下工作(如您所见),因此您可以忽略它。
[<Struct>]
type Container<'t> =
  {
    Item : 't
  }
  with
    override this.ToString () =
      sprintf "(%s)" (this.Item.ToString ())