“错误:一元运算符预期”重载运算符'*'

时间:2013-03-16 03:25:37

标签: c# dll struct operator-overloading

我熟悉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,其中*/带有下划线。根据{{​​3}},两者都可以超载。虽然两个运算符都列在二进制下,而不是一元。发生了什么事?

只是为了完成,这是整个类,就像我正在包装的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);
    };
};

1 个答案:

答案 0 :(得分: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);

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