为什么C#编译器生成错误,即使使用属性"SpecialName"

zzf*_*ima 7 c# attributes operator-overloading

我写代码:

using System.Runtime.CompilerServices;

namespace ConsoleApplication21
{
    class Program
    {
        static void Main(string[] args)
        {
            int i = new MyClass1() - new MyClass1();
            int j = new MyClass1() + new MyClass1();
        }
    }

    public class MyClass1
    {
        public static int operator -(MyClass1 i, MyClass1 j)
        {
            return 5;
        }

        [SpecialName]
        public static int op_Addition(MyClass1 i, MyClass1 j)
        {
            return 5;
        }
    }
}
Run Code Online (Sandbox Code Playgroud)

编译时错误:

错误1运算符"+"无法应用于"ConsoleApplication21.MyClass1"和"ConsoleApplication21.MyClass1"类型的操作数

所以,c#编译器不喜欢行"int j = new MyClass1()+ new MyClass1();" 当我打开ILDASM时,我得到了相同的运算符过载代码:

Method #1 (06000003) 
-------------------------------------------------------
    MethodName: op_Subtraction (06000003)
    Flags     : [Public] [Static] [HideBySig] [ReuseSlot] [SpecialName]  (00000896)
    RVA       : 0x00002078
    ImplFlags : [IL] [Managed]  (00000000)
    CallCnvntn: [DEFAULT]
    ReturnType: I4
    2 Arguments
        Argument #1:  Class ConsoleApplication21.MyClass1
        Argument #2:  Class ConsoleApplication21.MyClass1
    2 Parameters
        (1) ParamToken : (08000002) Name : i flags: [none] (00000000)
        (2) ParamToken : (08000003) Name : j flags: [none] (00000000)

Method #2 (06000004) 
-------------------------------------------------------
    MethodName: op_Addition (06000004)
    Flags     : [Public] [Static] [HideBySig] [ReuseSlot] [SpecialName]  (00000896)
    RVA       : 0x0000208c
    ImplFlags : [IL] [Managed]  (00000000)
    CallCnvntn: [DEFAULT]
    ReturnType: I4
    2 Arguments
        Argument #1:  Class ConsoleApplication21.MyClass1
        Argument #2:  Class ConsoleApplication21.MyClass1
    2 Parameters
        (1) ParamToken : (08000004) Name : i flags: [none] (00000000)
        (2) ParamToken : (08000005) Name : j flags: [none] (00000000)
Run Code Online (Sandbox Code Playgroud)

那么,为什么C#编译器会产生错误?

真的,奇怪的行为:如果我将MyClass1作为DLL引用,它工作正常!

在此输入图像描述 谢谢!

Pat*_*man 3

真的,奇怪的行为:如果我将 MyClass1 引用为 DLL,它工作正常!

这解释了很多。CLR 将代码编译成程序集。在此之前,它会评估您拥有的代码,而不考虑特殊名称签名。该代码给出了编译错误,因为当时还没有匹配的重载。它仍然需要嵌入和编译。(这是先有鸡还是先有蛋的问题)

已编译的程序集可以从另一个项目使用,因为程序集已完全编译。