Visual c++ 为什么是C++;CLI在托管类型上没有默认参数?

Visual c++ 为什么是C++;CLI在托管类型上没有默认参数?,visual-c++,c++-cli,default-parameters,Visual C++,C++ Cli,Default Parameters,以下行有错误不允许使用默认参数 public ref class SPlayerObj{ private: void k(int s = 0){ //ERROR } } 为什么C++在托管类型上没有默认参数? 我想知道是否有办法来解决这个问题。< P>它有可选的参数,它们看起来和C++语法看起来不一样。可选参数是语言互操作问题。它必须由进行调用的语言实现,它生成实际使用默认参数的代码。对于一种旨在简化互操作的语言来说,这是一个棘手的问题,比如C++/CLI,您当然不知道将使用

以下行有错误
不允许使用默认参数

public ref class SPlayerObj{
private:

    void k(int s = 0){ //ERROR
    }
}
为什么C++在托管类型上没有默认参数?
我想知道是否有办法来解决这个问题。

< P>它有可选的参数,它们看起来和C++语法看起来不一样。可选参数是语言互操作问题。它必须由进行调用的语言实现,它生成实际使用默认参数的代码。对于一种旨在简化互操作的语言来说,这是一个棘手的问题,比如C++/CLI,您当然不知道将使用哪种语言进行调用。或者它甚至有可选参数的语法。例如,C语言直到第4版才出现

如果语言确实支持它,编译器如何知道默认值是什么。值得注意的是,VB.NET和C#v4选择了不同的策略,VB.NET使用属性,C#使用modopt


您可以在C++/CLI中使用[DefaultParameterValue]属性。但是您不应该这样做,这是不可预测的。

除了第二部分关于如何解决这个问题的精确答案之外,您还可以使用多个同名方法来模拟默认参数的情况

public ref class SPlayerObj {
  private:
    void k(int s){ // Do something useful...
    }
    void k() { // Call the other with a default value 
       k(0);
    }
}

另一种解决方案是使用
[OptionalAttribute]
以及
可为空的
类型化参数。如果调用方未指定该参数,则该参数将是
nullptr

void k([OptionalAttribute]Nullable<int>^ s)
{
    if(s == nullptr)
    {
        // s was not provided
    }
    else if(s->HasValue)
    {
        // s was provided and has a value
        int theValue = s->Value;
    }
}
// call with no parameter
k();
// call with a parameter value
k(100);
void k([OptionalAttribute]可为空^s)
{
如果(s==nullptr)
{
//并没有提供
}
否则,如果(s->HasValue)
{
//s已提供并具有一个值
int theValue=s->Value;
}
}
//无参数调用
k();
//使用参数值调用
k(100);

“C++”没有托管类型,“C++/CLI”有托管类型;你应该更新问题答案可能会变成“因为”。@StephenLin我已经更新了title@sehe实际上,至少部分原因是因为C++默认参数是由调用方来评估的,而不是被调用方。因此,它们必须是函数元数据的一部分,才能从其他语言中工作……C添加了默认参数,我不记得它们是如何工作的……而且这比C++/CLI的最初开发要新得多。无论如何,如果将
int
更改为
System::Int32
,会发生什么?您知道[DefaultParameterValue]已在VS2012中修复?自VS2005以来,C++/CLI没有更改。因此,它和Java一样糟糕!这里正在进行大量装箱操作。顺便说一下,您可以使用s->HasValue,即使它是null ptr。速度要快得多。