4

これは機能します:

EndPoint endPoint = new IPEndPoint(_address, _port);
_socket.ReceiveFrom(buffer, 0, 1024, SocketFlags.None, ref endPoint);

しかし、これはしません:

IPEndPoint endPoint = new IPEndPoint(_address, _port);
_socket.ReceiveFrom(buffer, 0, 1024, SocketFlags.None, ref endPoint);

(エンドポイントのタイプに注意してください)

これは奇妙に思えます。ref キーワードがパラメーターの反変性を壊すのはなぜですか?

4

3 に答える 3

17

メソッド シグネチャでは、endPointパラメータがEndPointではなくとして宣言されているためIPEndPointです。メソッドが、変数に代入できないendPoint別の種類の に設定されないという保証はありません。EndPointIPEndPoint

たとえば、FooEndPointを継承するクラスとEndPoint、パラメーターFooを受け取るメソッドがあるとします。ref EndPoint

public class FooEndPoint : EndPoint
{
   ...
}

public void Foo(ref EndPoint endPoint)
{
    ...
    endPoint = new FooEndPoint();
    ...
}

IPEndPointそのメソッドにa を渡すことができた場合、 a は aではないためFooEndPoint、パラメーターへの a の割り当てはendPoint実行時に失敗します。FooEndPointIPEndPoint

于 2009-08-28T12:47:29.240 に答える
2

メソッド ReceiveFrom は新しい EndPoint を作成できますが、IPEndPoint は作成できないためです。このパラメーターは 2 つの方法で機能するため、型が正確に一致する必要があります。

于 2009-08-28T12:49:08.930 に答える