1

私はC++に精通しており、現在C#を少し学ぼうとしています。そうは言っても、私には4行のコードがあります。

[DllImport(@"Graphics.dll")]
public static extern vec2 operator * (vec2 a);

[DllImport(@"Graphics.dll")]
public static extern vec2 operator / (vec2 a);

[DllImport(@"Graphics.dll")]
public static extern vec3 operator * (vec3 a);

[DllImport(@"Graphics.dll")]
public static extern vec3 operator / (vec3 a);

また、VCS Expressでは、下線付きOverloadable unary operator expectedのエラーが表示されます。MSDNによると、どちらもオーバーロード可能です。両方の演算子は単項ではなく、バイナリの下にリストされていますが。どうしたの?*/

そして、完全にするために、ここに、私がラップしているDLLのクラス全体をそのまま示します。

class GraphicsDLL
{
    public struct vec2
    {
        float x, y;

        [DllImport(@"Graphics.dll")]
        vec2();

        [DllImport(@"Graphics.dll")]
        vec2(float ax, float ay);

        [DllImport(@"Graphics.dll")]
        public static extern vec2 operator + (vec2 a);

        [DllImport(@"Graphics.dll")]
        public static extern vec2 operator - (vec2 a);

        [DllImport(@"Graphics.dll")]
        public static extern vec2 operator * (vec2 a);

        [DllImport(@"Graphics.dll")]
        public static extern vec2 operator / (vec2 a);
    };

    public struct vec3
    {
        float x, y, z;

        [DllImport(@"Graphics.dll")]
        vec3();

        [DllImport(@"Graphics.dll")]
        vec3(float ax, float ay, float az);

        [DllImport(@"Graphics.dll")]
        public static extern vec3 operator + (vec3 a);

        [DllImport(@"Graphics.dll")]
        public static extern vec3 operator - (vec3 a);

        [DllImport(@"Graphics.dll")]
        public static extern vec3 operator * (vec3 a);

        [DllImport(@"Graphics.dll")]
        public static extern vec3 operator / (vec3 a);
    };
};
4

1 に答える 1

3

C#では、両方*/二項演算子としてのみオーバーロードできます。それらは単一の形式でオーバーロードできないため、そのエラーが発生します。およびバージョンは、バイナリバージョン(加算、減算)ではなく単項バージョンをオーバーロードしているために機能します +-

このエラーは、演算子のバイナリ形式を使用して修正できます

    [DllImport(@"Graphics.dll")]
    public static extern vec2 operator * (vec2 a, vec2 other);

    [DllImport(@"Graphics.dll")]
    public static extern vec2 operator / (vec2 a, vec2 other);

このコードでさえ、実行時には機能しないのではないかと思います。ここの署名によってC++メンバーに直接PInvokeしようとしているようです。もしそうなら、それはうまくいきません。C ++コードを呼び出し、その関数をPInvokeする単純なCエントリポイントを定義する必要があります。

于 2013-03-16T03:28:20.483 に答える