1

このコードは機能します

  type UserNode(myid:int64, labeled:bool) = 
      static member SkypeId (x:UserNode) = x.SkypeI

      member this.SkypeI = myid

しかし、これはそうではありません:「SkypeIdはインスタンスメソッドではありません」

私が持っていると思う唯一の違いは、「d」とSkypeIの終わりです

  type UserNode(myid:int64, labeled:bool) = 
      static member SkypeId (x:UserNode) = x.SkypeId

      member this.SkypeId = myid

ここで何が欠けていますか...?

奇妙なことに、定義されている静的メソッドとして SkypeId を認識します....

4

3 に答える 3

3

この制限は Common Language Specification (CLS) の一部であり、F# に固有のものではありません。

CLI 仕様から、CLS ルール 5 は次のように述べています。

CLS 準拠のスコープで導入されたすべての名前は、名前が同一であり、オーバーロードによって解決される場合を除き、種類に関係なく別個のものでなければなりません。つまり、CTS では 1 つの型でメソッドとフィールドに同じ名前を使用できますが、CLS ではできません。

次のコンパイル可能な IL​​ が示すように、Common Type System (CTS) はこれを許可します。

.class public auto ansi sealed Foo
extends [mscorlib]System.Object
{
    .method public instance void .ctor()
    {
        ldarg.0
        call instance void [mscorlib]System.Object::.ctor()
        ret
    }

    .field public int32 Bar

    .method public void Bar()
    {
        ldstr "Instance method"
        call void [mscorlib]System.Console::WriteLine(string)
        ret
    }

    .method static public void Bar()
    {
        ldstr "Static method"
        call void [mscorlib]System.Console::WriteLine(string)
        ret
    }
}

ただし、F# や C# などの CLS 準拠の言語から上記のクラスのすべてのメンバーにアクセスすることはできません。

于 2013-05-16T21:01:10.290 に答える
1

memberと同じ規則には従わないためlet、クラスのすべてのメンバーを一度に使用できます (実際、いくつかのエッジ ケースで複雑な相互依存関係を引き出すのに便利なトリックです)。

残念ながら、.NET 言語ではクラス メンバーを解決するためのルールが複雑になることが多く、静的とインスタンスの区別が難しい場合があります。

この正確な問題の構文修正があるかどうかはわかりませんが、一般的に、同じ名前を避けることは、あなたが言及したように常に機能します。

于 2013-05-16T18:07:50.440 に答える
1

c# では、次のようになります。

public class UserNode
{
    private readonly int _myid;

    public UserNode(int myid)
    {
        _myid = myid;
    }

    public static int SkypeId(UserNode x)
    {
        return x.SkypeId;
    }

    public int SkypeId
    {
        get { return _myid; }
    }
}

2 つのエラーが発生しました: - タイプ 'xxx.UserNode' には既に 'SkypeId' の定義が含まれています。- そして、静的メソッド内で「式の型 'メソッド グループ' を戻り値の型 int に変換できません」。Leaf Garland が書いたように、同じ名前のメソッドとプロパティは存在できません。しかし、オーバーロードされたメソッドは機能します:

type UserNode(myid:int64, labeled:bool) = 
  static member SkypeId (x:UserNode) = x.SkypeId()

  member this.SkypeId() = myid
于 2013-05-17T08:32:06.980 に答える