-2

次のような単純なクラスを作成します。

public class Pusher : IPusher,Hub
{
}

最初にクラスから継承し、次に他のインターフェイスから継承する必要があるため、コンパイル エラー( Interface definition is expected) が発生します。

public class Pusher : Hub,IPusherしかし、との違いは何ですかpublic class Pusher : IPusher,Hub

デフォルト値を持つメソッドパラメータでもこのような対流が見られます

public void ExampleMethod(int required, string optionalstr = "default string")

パラメータの最後にデフォルト値パラメータを定義する必要があります。

それはCLRに関連していますか?

4

2 に答える 2

2

いいえ、CLR とは関係ありません。これらは言語固有の制限です。

継承されたクラスをインターフェイスの前に配置する必要がある理由を正確に見つけることはできませんが、おそらく明確にするために行われます。このクラスは、他の 1 つのクラスからしか継承できませんが、複数のインターフェイスを実装できます。継承されるクラスが常に最初に配置されることがわかっていると、何が起こっているのかを簡単に確認できます。

オプションのパラメーターの順序付けは、より実用的な性質のものです。C# では、オプションのパラメーターのプレースホルダーとして空のパラメーターを使用できないため、最後に配置する必要があります (そうしないと、名前付きパラメーターを使用してメソッドを呼び出すことしかできなくなります)。次のようにメソッドを呼び出すことはできません。

ExampleMethod(42, );

オプションの値で呼び出すには、呼び出しから省略します。

ExampleMethod(42);

したがって、オプションのパラメーターが最後ではない場合、次のような呼び出しを行うことができないため、オプションではありません。

ExampleMethod(, 42);
于 2013-03-09T17:38:23.497 に答える
1

まあ、最初のケースでは、それは単なる慣例です。可読性を高め、コンパイル時のチェックを簡単にするために、クラスを最初にする必要があります。しかし、議論は別のケースです。最新の引数ではなく、最初の引数にデフォルト値を指定するとします。コンパイラがあなたの言いたいことを検出する方法。

例: int func(int a, int b = 10, int c)で、 func(10, 20); を呼び出します。 これは何をすることになっていますか?そうは言えません。

編集 (例 2): int func(int a, int b = 1, int c, int d = 2, int e) and call func(1,2,3,4); この場合、どの変数が省略されたかは明確ではありません。BとDの両方になる可能性があります。

于 2013-03-09T17:35:04.177 に答える