4
public struct MyInt
{
    public int csInt;

    public MyInt(int i)
    {
        csInt = i;
    }

    public MyInt(double d)
    {
        csInt = (int)d;
    }

    public static implicit operator MyInt(int value)
    {
        return new MyInt(value);
    }

    public static implicit operator MyInt(double value)
    {
        return new MyInt(value);
    }
}


int MyFunc(MyInt i = 0)
{
    return -1;
}

我想实现一个包装器结构MyInt(此处简化)以接受int默认值(我知道这很奇怪和不自然,我只需要它来遵守其他语言格式),但是当我像上面那样编码时遇到错误,错误在int MyFunc(MyInt i = 0)VS2012 说:

'int' 类型的值不能用作默认参数,因为没有标准转换为 MyInt 类型

据我所知, int 和 double 在 C# 中也定义为 struct。所以我尝试了以下方法:

int MyFunc(double i = (int)0)
{
return -1;
}

它通过了!因此我认为默认参数中允许类型转换。

所以我的问题是:

  1. 为什么不能使用 MyInt 的隐式类型转换作为默认参数?
  2. VS 错误消息中的标准转换是什么意思,它与 MyInt 中定义的隐式转换不同吗?
4

2 回答 2

1

隐式转换运算符是methods,您不能使用方法(或事件静态字段)作为默认参数 - 只允许使用常量(这是有道理的,因为编译器实际上会在您调用方法的任何地方使用这些常量。)

在您的情况下,由于您想要结构的默认值(即所有字段初始化为 0),您可以使用default关键字:

int MyFunc(MyInt i = default(MyInt))
{
    return -1;
}

C# 标准转换是编译器可以自行执行的转换(如 Int32 到 Double 或任何类型到 Object)。您可以在C# Specification中阅读所有关于它们的信息。

于 2013-09-16T06:19:25.780 回答
0

如果你试试这个:

int MyFunc(MyInt i = (MyInt)0)

你得到一个错误

'i' 的默认参数值必须是编译时常量

这告诉你为什么它不能工作 - 在编译时,没有办法告诉你如何将0你输入的转换成 a MyInt(因为你的操作符代码在运行时运行)。

它之所以有效,是double因为 C# 编译器知道该类型;它不是用户定义的。

您可以通过定义重载而不是使用默认参数值来解决它:

int MyFunc(MyInt i)
{
    return -1;
}

int MyFunc()
{
    return MyFunc((MyInt)0);
}
于 2013-09-16T04:20:30.767 回答