0

つまり、名前付き引数は何らかの形で署名のように見えます。名前を使用して名前付きメソッドを呼び出すことはできず、パラメーターの位置を尊重するだけです。ただし、署名と名前が同じで、パラメーターの名前が異なる 2 つのメソッドを作成することはできません。

インターフェイスは、クラスのメソッドに特定のパラメーターの名前を使用させることができますか?

名前付き引数の使用:

int i = Function(NamedArgument: x);

名前付き引数を使用しない:

int i = 関数 (x);

4

1 に答える 1

4

パラメータ名は、一意性制約の観点から署名の一部ではありません。

C# 4 仕様のセクション 3.6 から:

メソッドのシグネチャは、メソッドの名前、型パラメーターの数、および各仮パラメーターの型と種類 (値、参照、または出力) で構成され、左から右の順序で考慮されます。これらの目的のために、仮パラメーターの型で発生するメソッドの型パラメーターは、その名前ではなく、メソッドの型引数リスト内の序数位置によって識別されます。メソッドのシグネチャには、戻り値の型、一番右のパラメーターに指定できる params 修飾子、オプションの型パラメーターの制約は含まれません。

ただし、パラメーター名、コンパイラーがメソッドについて「知っている」ものの一部です。名前付き引数に使用されるため、メタデータで伝播する必要がある情報です。

インターフェイスは、クラスのメソッドに特定のパラメーターの名前を使用するように強制できますか?

いいえ。実際、非常に紛らわしいコードが発生する可能性があります。

interface IFoo
{
    public int M(int x, int y);
}

public class Foo : IFoo
{
    public int M(int y, int x)
    {
        return x - y;
    }
}

...

Foo foo = new Foo();
IFoo ifoo = foo;
Console.WriteLine(foo.M(x: 10, y: 3)); // Prints 7
Console.WriteLine(ifoo.M(x: 10, y: 3)); // Prints -7
于 2012-08-10T16:58:55.700 に答える