2
class CoOrds
{
    public int x, y;

    public CoOrds() {
        x = 0;
        y = 0;
    }

    public CoOrds(int x, int y) {
        this.x = x;
        this.y = y;
    }
}

public CoOrds toto() {
    CoOrds B = new CoOrds(3, 2);
    return B;
}

private void result_Click(object sender, EventArgs e) {
    l6.Text = "";
    CoOrds D = new CoOrds();
    D = toto();
    l6.Text = "(" + D.x + "," + D.y + ")";
}

次のエラーが発生します:

Error 2 Inconsistent accessibility: return type 'johny.Form1.CoOrds' is less accessible than method 'johny.Form1.toto()

4

2 に答える 2

7

CoOrdsクラスは内にネストされているためForm1、デフォルトでprivate(つまり、Form1クラス内でのみ使用できます)。最も簡単な解決策は、CoOrdsクラスを作成することpublicです。

public class CoOrds{ 

public int x, y; // ...

もう1つの方法は、単にクラスのネストを解除することですCoOrds。つまり、クラスの宣言をクラスの外にForm1完全に移動します。

于 2013-01-05T13:27:13.747 に答える
2

元の回答(ネストされたタイプであることに気付く前に)

はい-おそらくForm1Form1.toto()両方ともパブリックです-一方Coordsprivateネストされていないタイプのデフォルトのアクセシビリティ)。メソッドを表示できるすべてのコードにアクセスできない戻り型またはパラメーター型のメソッドを作成することはできません。意味がありません。

オプション:

  • 内部Form1にする
  • 内部Form1.toto()にする
  • 公開Coordsする

個人的にはForm1、可能であれば内部化することをお勧めします。単体テスト(私が使用するInternalsVisibleTo)以外のコードでフォームを使用できるようにする必要があることはめったにありません。内部Form1.toto()化も同様に問題ありません。私はタイプとメンバーをできるだけプライベートに保つことを好むのでCoords、最後の手段としてのみ公開します。

また、.NETの命名規則に従い、。よりもわかりやすい名前を付けることを強くお勧めしますtoto()。ああ、パブリックフィールドは避けてください-代わりにプロパティを公開してください。不変にすることもできます。

ネストされたタイプであることに気づきました...

Coords実際には、内にネストされたクラスのように見えます。これは、デフォルトでプライベートForm1であることを意味します。ネストされたクラスを公開したいのは珍しいことです-そしてそれはとにかく本当に緊密に結びついているようには見えません。そもそもトップレベル(ネストされていない)タイプにすることをお勧めします。Form1

于 2013-01-05T13:27:32.550 に答える