1. ホーム
  2. c#

[解決済み] C#がメソッドを非デリゲート型に変換できない

2022-01-30 13:28:33

質問

というクラスがあります。 Pin .

public class Pin
{
    private string title;

    public Pin() { }

    public setTitle(string title) {
        this.title = title;
    }
    public String getTitle()
    {
        return title;
    }
}

別のクラスから、Pinsオブジェクトを List<Pin> そして、もう一つは、リストピンを反復して、要素を取得したいのです。そこで、次のようなコードを用意しました。

foreach (Pin obj in ClassListPin.pins)
{
     string t = obj.getTitle;
}

このコードでは、タイトルを取得することができません。なぜですか?

(注 ClassListPin は、いくつかの要素を含む単なる静的なクラスで、そのうちのひとつである List<Pin> ピン)

解決方法は?

メソッド呼び出しの後に括弧を付けないと、コンパイラーはメソッド自体(デリゲート型)について話しているのだと勘違いしてしまいますが、実際にはそのメソッドの戻り値について話しているのです。

string t = obj.getTitle();


重要でない余分な情報

また、プロパティも見てみましょう。そうすれば、titleを変数のように使いながら、内部的には関数のように動作させることができます。そうすれば、関数を書く必要がなくなります。 getTitle()setTitle(string value) が、こんな風にできるんですね。

public string Title // Note: public fields, methods and properties use PascalCasing
{
    get // This replaces your getTitle method
    {
        return _title; // Where _title is a field somewhere
    }
    set // And this replaces your setTitle method
    {
        _title = value; // value behaves like a method parameter
    }
}

または、自動実装されたプロパティを使用することもでき、その場合はデフォルトでこれを使用します。

public string Title { get; set; }

また、独自のバッキングフィールドを作成する必要もないでしょう( _title ) を、コンパイラが自動的に作成します。

また、プロパティアクセサ(ゲッターとセッター)のアクセスレベルを変更することができます。

public string Title { get; private set; }

プロパティをフィールドのように使用する、つまり

this.Title = "Example";
string local = this.Title;