1

在 C# 中,我可以让 Visual Studio 保留委托的参数名称。
例如,如果我有:

public delegate void Blah(object myArg);
public event Blah Foo;

然后,当我向事件添加方法时,Visual Studio UI 会自动保留名称并创建方法:

void Form1_Foo(object myArg);

但是,如果我在 C++/CLI 中声明一个委托:

public:
delegate void Blah(Object^ myArg);
event Blah^ Foo;

它不保留名称并创建一个带有无意义名称的方法:

void Form1_Foo(object A_0)

如何在 C++/CLI 中为参数设置有意义的名称?

编辑(添加 ildasm 结果):

C++ CLI 事件:

.method public hidebysig specialname instance void 
        Invoke(object myArg) cil managed
{
} // end of method Blah::Invoke

C# 事件:

.method public hidebysig newslot virtual 
        instance void  Invoke(object myArg) runtime managed
{
} // end of method Blah::Invoke
4

1 回答 1

3

这个问题没有暗示真正的问题,我无法得到重现。但后来意识到可能发生的事情,C++ 编译器与其他托管编译器不同,而且 MSIL,它不需要在声明中命名参数。结果是这样的:

namespace CppClassLibrary {
    public ref class Example {
    public:
        delegate void Blah(int, int, int, int);
        event Blah^ Foo;
    };
}

在 C# 中生成此自动生成的事件处理程序:

    void test_Foo(int A_0, int A_1, int A_2, int A_3) {
        throw new NotImplementedException();
    }

看起来像一个灌篮高手的解释。您只是忘记在委托声明中命名参数,C++ 编译器被迫合成它们以编写正确的 MSIL。当然容易修复。

于 2014-09-05T22:46:43.153 回答