web-dev-qa-db-ja.com

C#はメソッドを非デリゲート型に変換できません

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

public class Pin
{
    private string title;

    public Pin() { }

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

別のクラスから、List<Pin>ピンと別のものから、リストピンを反復して要素を取得したい。だから私はこのコードを持っています。

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

このコードでは、タイトルを取得できません。どうして?

(注:ClassListPinは、いくつかの要素を含む静的なクラスであり、これらの要素の1つはList<Pin>ピン)

31
gts13

メソッド呼び出しの後に括弧を追加する必要があります。そうしないと、コンパイラはメソッド自体(デリゲート型)について話していると判断しますが、実際にはそのメソッドの戻り値について話していることになります。

_string t = obj.getTitle();
_

追加の非必須情報

また、プロパティを見てください。そうすることで、タイトルを変数のように使用できますが、内部的には関数のように機能します。そうすれば、関数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;
_
58
antonijn

@Antonijnが述べたように、括弧を追加してgetTitleメソッドをexecuteする必要があります:

 string t = obj.getTitle();

しかし、私はあなたがJava C#でプログラミングしていることを追加したいと思います。 properties (getメソッドとsetメソッドのペア)の概念があります。そのような場合:

public class Pin
{
    private string _title;

    // you don't need to define empty constructor
    // public Pin() { }

    public string Title 
    {
        get { return _title; }
        set { _title = value; }
    }  
}

さらに、この場合、getおよびsetメソッドの生成だけでなく、逆ストレージの生成も auto-impelemented property usageを使用してコンパイラに要求できます。

public class Pin
{
    public string Title { get; set; }
}

そして、プロパティはフィールドのように使用されるため、executeメソッドは不要です:

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

getTitleは関数なので、() その後。

string t = obj.getTitle();
7
Bobson

前述のように、obj.getTile()を使用する必要があります

しかし、この場合、 Property を使用したいと考えています。

public class Pin
{
    private string title;

    public Pin() { }

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

    public String Title
    {
        get { return title; }
    }
}

これにより、使用できるようになります

foreach (Pin obj in ClassListPin.pins)
{
     string t = obj.Title;
}
5
eandersson

以下のようにクラスコードを単純化することができ、そのまま動作しますが、サンプルを動作させたい場合は、最後に括弧を追加します。string x = getTitle();

public class Pin
{
   public string Title { get; set;}
}
5
legrandviking

getTitlestringではないため、明示的にcallを指定しないと、メソッドへの参照またはdelegateを(必要に応じて)返します。 =メソッド。

次の方法でメソッドを呼び出します。

string t= obj.getTitle() ; //obj.getTitle()  says return the title string object

ただし、これは機能します。

Func<string> method = obj.getTitle; // this compiles to a delegate and points to the method

string s = method();//call the delegate or using this syntax `method.Invoke();`
3
Lews Therin

メソッドを実行するには、メソッドが引数を取らない場合でも括弧を追加する必要があります。

したがって、次のようになります。

string t = obj.getTitle();
2
Andre Loker