43

私は次の機能を持っています:

public static extern uint FILES_GetMemoryMapping(
    [MarshalAs(UnmanagedType.LPStr)] string pPathFile,
    out ushort Size,
    [MarshalAs(UnmanagedType.LPStr)] string MapName,
    out ushort PacketSize,
    ref Mapping oMapping,
    out byte PagesPerSector);

私はこのように呼びたい:

FILES_GetMemoryMapping(MapFile, out size, MapName,
    out PacketSize, null, out PagePerSector);

残念ながら、null型を必要とし、キャストを必要としないフィールドを渡すことはできませんref Mapping。これを修正しようとしました。

助言がありますか?

4

7 に答える 7

42

渡すことができない理由nullref、C# コンパイラによってパラメーターが特別な扱いを受けるためです。すべてrefのパラメーターは、呼び出している関数に渡すことができる参照である必要があります。渡したいのでnull、関数が期待する参照を提供していないため、コンパイラはこれを許可することを拒否しています。

唯一の現実的なオプションは、ローカル変数を作成し、それを に設定してnull渡すことです。コンパイラは、それ以上のことを行うことを許可しません。

于 2009-04-10T01:52:07.633 に答える
32

Mapping は構造体だと思いますか? その場合、FILES_GetMemoryMapping()署名の異なる 2 つのバージョンのプロトタイプを作成できます。を渡したい 2 番目のオーバーロードではnull、パラメーターを anIntPtrにして使用しますIntPtr.Zero

public static extern uint FILES_GetMemoryMapping(
    [MarshalAs(UnmanagedType.LPStr)] string pPathFile,
    out ushort Size,
    [MarshalAs(UnmanagedType.LPStr)] string MapName,
    out ushort PacketSize,
    IntPtr oMapping,
    out byte PagesPerSector);

呼び出し例:

FILES_GetMemoryMapping(MapFile, out size, MapName,
   out PacketSize, IntPtr.Zero, out PagePerSector);

Mapping が実際には構造体ではなくクラスである場合は、値を渡す前に値を null に設定してください。

于 2009-04-10T01:51:20.300 に答える
11

1 つの方法は、ダミー変数を作成し、null を割り当てて、それを渡すことです。

于 2009-04-10T01:50:50.990 に答える
4
Mapping oMapping = null;

FILES_GetMemoryMapping(MapFile, out size, MapName, out PacketSize, ref oMapping, out PagePerSector);
于 2009-04-10T01:50:57.243 に答える
4

@JaredPar の答えは間違いなく正しい答えですが、コードとポインターという別の答えがあります。unsafe

unsafe {
    Mapping* nullMapping = null;
    FILES_GetMemoryMapping(
            MapFile,
            out size,
            MapName,
            out PacketSize,
            ref *nullMapping,    // wat?
            out PagePerSector);
}

実行時に失敗するように見えますが、そうではありません.ref*ref *nullMappingFILES_GetMemoryMapping()

これはおそらく良い考えではありませんが、可能です。

于 2015-10-22T14:43:31.037 に答える