C++ cli C++/CLI:如何在C++/CLI?

C++ cli C++/CLI:如何在C++/CLI?,c++-cli,optional-parameters,callermembername,C++ Cli,Optional Parameters,Callermembername,在C#和VB.Net中,我可以使用CallerMemberNameAttribute以字符串形式获取调用程序的名称: public void Caller([CallerMemberName]string memberName = "") { Debug.Print(memberName); } 我想在C++/CLI中也这样做,但不知何故,我无法让它正常工作。尝试了几种构造,我开始怀疑C++/CLI编译器是否支持此属性 以下是一个(简化的)实现: using namespace Syst

在C#和VB.Net中,我可以使用CallerMemberNameAttribute以字符串形式获取调用程序的名称:

public void Caller([CallerMemberName]string memberName = "")
{
   Debug.Print(memberName);
}
我想在C++/CLI中也这样做,但不知何故,我无法让它正常工作。尝试了几种构造,我开始怀疑C++/CLI编译器是否支持此属性

以下是一个(简化的)实现:

using namespace System::Runtime::CompilerServices;
public ref class InvokeExample
{
    Invoke([CallerMemberName][Optional]String^ name)
    {
        Debug::Print(name);
    }
}
在C#应用程序中调用此方法时,name的值为null。还尝试使用属性DefaultParameterValue,但也没有帮助。现在已经没有主意了

显而易见的答案是,为什么不在C中实现呢?
在这个特定的例子中,我仅限于C++/CLI。

我使用reflector查看C++/CLI和C#/VB.Net版本之间的差异,它们看起来完全相同

然后使用了ILDASM,现在我想我知道为什么它不起作用了(在阅读本文之后)

以下是il代码:

C++/CLI

.method public hidebysig instance string 
        Caller([opt] string methodName) cil managed
{
  .param [1]
  .custom instance void [System]System.Runtime.InteropServices.DefaultParameterValueAttribute::.ctor(object) = ( 01 00 0E 00 00 00 ) 
  .custom instance void [mscorlib]System.Runtime.CompilerServices.CallerMemberNameAttribute::.ctor() = ( 01 00 00 00 ) 
  // Code size       2 (0x2)
  .maxstack  1
  IL_0000:  ldarg.1
  IL_0001:  ret
} // end of method ClassCPP::Caller
C#

VB.Net中的IL代码与C#的区别如下:

.param [1] = nullref
我怀疑,因为C++/CLI发出DefaultParameterValue,而不是使用默认值初始化.param[1],所以C#编译器不会将该值转换为调用方成员名称


如果MSDN页面描述了C++/CLI项目的此类限制,那么这将非常方便。可以节省很多时间。

尝试中没有任何意义,这在C++编译器中没有实现。C++/CLI在2005年被冻结。您必须使用。请注意,Hans的建议意味着严重的性能惩罚。
.param [1] = nullref