gpt4 book ai didi

f# - F# 类和结构中主构造函数之间的行为差​​异?

转载 作者:行者123 更新时间:2023-12-02 23:47:54 26 4
gpt4 key购买 nike

如果我在 Visual Studio Express 2013 中尝试此类型定义,则会收到错误:

type Foo(bar : int) =
struct
member x.bar = bar
end

如果我将其更改为一个类,则不会收到任何错误:

type Foo(bar : int) =
class
member x.bar = bar
end

我得到的错误是:

The member 'bar' can not be defined because the name 'bar' clashes with the field 'bar' in this type or module"

如果我稍微更改构造函数参数的名称,错误就会消失。我一般了解 CLR 结构和类之间的差异,但我不太明白这种行为差异的原因。谁能解释一下吗?

我主要是想问这个问题,以防答案能消除我对 F# 的一些更深层次的误解。谢谢。

最佳答案

虽然我在规范中找不到相关的引用资料,但使用反编译器进行的一些实验表明,结构上的主要构造函数参数始终被编译为具有相同名称的字段。对于类,使用一组更复杂的规则(请参阅 §8.6.1.3 )来确定其编译形式,其中包括在字段名称与成员发生冲突时进行修改。

比较该结构和类的编译形式:

type S(bar: int) = struct end

type C(bar: int) =
member x.bar = bar
public class C
{
internal int bar@12;

public int bar
{
get
{
return this.bar@12;
}
}

public C(int bar)
{
this.bar@12 = bar;
}
}

public struct S : IEquatable<Program.S>, IStructuralEquatable, IComparable<Program.S>, IComparable, IStructuralComparable
{
internal int bar;

public S(int bar)
{
this.bar = bar;
}
}

该结构的主要构造函数参数被编译为字段(并分配!),即使它未使用。另一方面,类允许成员和参数具有相同的名称。诚然,这并不能解释为什么,但可能有助于澄清观察到的行为。

关于f# - F# 类和结构中主构造函数之间的行为差​​异?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/22696693/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com