ホーム>source

異なるタイプのインデックス付きプロパティを使用する方法はありますか。 このフォーラムを検索しようとしましたが、インデックス付きプロパティに名前を指定することができないため、この質問は少し異なります。

だからそれをどのように行うことができますか(確かにコンパイラは文句を言います): 1つのプロパティがオブジェクトを別の配列を返します。 Visual Basicではこのタイプが可能ですが、C#ではできませんか?

Property1:

private Point3d this[int index] {
    get {
        return this.m_Levels[this.m_NodeLevel[index]][index];
    }
    set {
        this.m_Levels[this.m_NodeLevel[index]][index] = value;
    }
}

プロパティ2:

private Point3d[] this[int index] {
    get
    {
        return this.m_Levels[index];
    }
    set
    {
        this.m_Levels[index] = value;
    }
}

あなたの答え
  • 解決した方法 # 1

    @slfanが言ったように、 this に2つの同一の署名を与えることはできません  プロパティ。


    あなたの理解のために、これを変換することができます

    public int this[int index]
    {
        get
        {
            return this.m_array[index];
        }
        set
        {
            this.m_array[index] = value;
        }
    }
    
    

    これとともに翻訳

    public int get_Item(int index)
    {
        return this.m_array[index];
    }
    public void set_Item(int index, int value)
    {
        this.m_array[index] = value;
    }
    
    

    小さくするには:

    int this[int index] { get { ... } }
    
    

    同等です(等しい?)へ

    int get_Item(int index) { ... }
    
    

    あなたと同じようにできる これ作って:

    int get_Item(int index) { ... }
    int get_Item(byte index) { ... }
    int get_Item(float index) { ... }
    int get_Item(string index) { ... }
    
    

    君はできる これも作ります:

    int this[int index] { get { ... } }
    int this[byte index] { get { ... } }
    int this[float index] { get { ... } }
    int this[string index] { get { ... } }
    
    

    だが あなたと同じようにできない これ作って:

    public int get_Item(int index) { ... }
    public int get_Item(int index) { ... } // <-- error
    
    

    また:

    public int get_Item(int index) { ... }
    public float get_Item(int index) { ... } // <-- error
    
    

    君はできない これ作って:

    int this[int index] { get { ... } }
    int this[int index] { get { ... } } // <-- error
    
    

    また:

    int this[int index] { get { ... } }
    float this[int index] { get { ... } } // <-- error
    
    

  • 解決した方法 # 2

    同じ署名を使用することはできません。コンパイラは、どのインデクサーメソッドを呼び出すかをどのように知る必要がありますか? 2番目のパラメーター(ノードレベルのインデックスなど)を使用すると、コンパイラーは2つの呼び出しを区別できます。プロパティ1には、このコードを使用できます。

    private Point3d this[int nodeLevel, int index] {
        get {
            return this.m_Levels[this.m_NodeLevel[nodeLevel]][index];
        }
        set {
            this.m_Levels[this.m_NodeLevel[nodeLevel]][index] = value;
        }
    }
    
    

    インデクサーの代わりに、常に名前付きの関数を使用できます(例: int GetValueAtLevel(int index) )。

関連記事

  • 前へ java - JPAクエリ:サブクエリをグループ化条件に結合する
  • 次へ クラスのインスタンス化C#