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# 中,两者*/都只能作为二元运算符重载。它们不能以一元形式重载,因此您会收到该错误。+and版本有效,-因为您重载了一元版本而不是二进制版本(加法,减法)。

可以通过使用运算符的二进制形式来修复此错误

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

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

我怀疑即使在执行时这段代码也不会为你工作。看起来您正试图通过此处的签名直接 PInvoke 进入 C++ 成员。如果是这样,那就行不通了。您需要定义一个简单的 C 入口点,该入口点调用 C++ 代码并将 PInvoke 调用到该函数中。

于 2013-03-16T03:28:20.483 回答