F#不';不适用于包含其他类型的类型

F#不';不适用于包含其他类型的类型,f#,F#,我有一个类型“Team”,其中包含另一个类型“Employee”。我已重写类型“Employee”的ToString()。但是,当我为类型“Team”执行ToString()时,“Employee”中的详细信息与标准的ToString()实现一起打印出来,我的重写逻辑从未使用过。有人能帮助理解为什么超控无效吗?代码如下: type Employee = { name : string address : string } override

我有一个类型“Team”,其中包含另一个类型“Employee”。我已重写类型“Employee”的ToString()。但是,当我为类型“Team”执行ToString()时,“Employee”中的详细信息与标准的ToString()实现一起打印出来,我的重写逻辑从未使用过。有人能帮助理解为什么超控无效吗?代码如下:

type Employee =
    {
        name : string
        address : string
    }
    override this.ToString() = sprintf "Hello %s" this.name

type Team =
    {
        employee1 : Employee
    }
with member this.ToTightString =
        this.ToString().Replace(" ","")


let employee = { name="Bob"; address="Unknown"; } 
let team = {employee1=employee}
printfn "%s" (employee.ToString()) // Override works!
// OUTPUT: Hello Bob
printfn "--------------------"
printf "%s" team.ToTightString // Override doesn't work
// OUTPUT: {employee1={name="Bob";address="Unknown";};}
如上所述,StructuredFormatDisplay中指定的类型(例如type1)的文本表示形式将保留,即使对包含“type1”类型的类型调用ToString()。下面是一个例子:

open System.Text.RegularExpressions

[<StructuredFormatDisplay("name=Always Harry address={address}")>]
type Employee =
    {
        name : string
        address : string
    }

type AddressContainer = 
    {
        employee: Employee
        containerName: string
    }

let address1 = { name="Bob"; address="Random City" } 
let addressContainer1 = { employee=address1; containerName= "container1"}
printf "%s" (address1.ToString()) // prints "name=Always Harry address=Random City"
printf "%s" (addressContainer1.ToString()) // prints {employee = name=Always Harry address=Random City;  containerName = "container1";}
open System.Text.regular表达式
[]
类型员工=
{
名称:string
地址:string
}
类型AddressContainer=
{
雇员:雇员
容器名称:字符串
}
让address1={name=“Bob”;address=“Random City”}
让addressContainer1={employee=address1;containerName=“container1”}
printf“%s”(address1.ToString())//打印“name=始终Harry address=随机城市”
printf“%s”(addressContainer1.ToString())//打印{employee=name=Always Harry address=Random City;containerName=“container1”}

您从未对员工调用覆盖。试试
this.employe1.ToString().Replace(“,”)
。是的,这很有效。这是否意味着当且仅当我使用ToString()方法显式调用它时,重写才会起作用?因为我尝试执行printf“%A”employee,而ToString()也没有被覆盖,只是打印得很漂亮@简单的答案是肯定的。这是因为记录类型的默认ToString实现调用了
sprintf
,它具有输出记录类型的特殊逻辑。出现这种情况的部分原因是现在没有时间给出完整的答案,但请看,它允许您为
sprintf“%a”myInstance
指定自定义表示形式。这可能是你要找的东西的一部分。顺便说一句,这似乎对你也有用,不过请注意,这个问题是2012年提出的。是的,它很有效。谢谢我将创建一个示例并将其作为答案发布。谢谢!我以为这个属性只在FSI中起作用,但在我的程序中也起作用。重写ToString的意义是什么?是否存在ToString允许的属性无法执行的操作?