Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/306.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 尝试在c中使用可选参数#_C#_Visual Studio - Fatal编程技术网

C# 尝试在c中使用可选参数#

C# 尝试在c中使用可选参数#,c#,visual-studio,C#,Visual Studio,但是我收到了错误 可选参数必须出现在所有必需参数之后 虽然我的可选参数出现在我的必需参数之后?我做错了什么 public string UserAnswer(string optInput = null, [Optional] int num1) { bool isOperatorValid; do { string answer = optInput ?? Console.ReadLine();

但是我收到了错误

可选参数必须出现在所有必需参数之后

虽然我的可选参数出现在我的必需参数之后?我做错了什么

public string UserAnswer(string optInput = null, [Optional] int num1)
{
        bool isOperatorValid;

        do
        {
            string answer = optInput ?? Console.ReadLine();
            isOperatorValid = true;

            switch (answer)
            {
                case "a":
                    Console.WriteLine($"Your result: {num1} + {num2} = " + (num1 + num2));
                    break;

                case "s":
                    Console.WriteLine($"Your result: {num1} - {num2} = " + (num1 - num2));
                    break;

                case "m":
                    Console.WriteLine($"Your result: {num1} * {num2} = " + (num1 * num2));
                    break;

                case "d":
                    Console.WriteLine($"Your result: {num1} / {num2} = " + (num1 / num2));
                    break;

                default:
                    Console.WriteLine("Invalid input please try again");
                    isOperatorValid = false;
                    break;
            };
        } while (!isOperatorValid);

        return optInput;
}

问题是,您使用的是
[可选]
而不是可选参数的C语言集成。就语言而言(就方法声明部分而言),
num1
是必需的参数,因此它必须位于
optInput
之前。编译器在使用方法时确实知道
OptionalAttribute
,但在声明方法时却不知道

假设您希望这两个参数都是可选的,请对这两个参数使用语言集成:

publicstringuseranswer(stringoptinput=null,intnum1=0)

我强烈建议不要显式使用
OptionalAttribute
,因为现在有了语言支持,没有理由这么做,而且在其他人阅读代码时,这样做更容易造成混乱,而不是帮助他们。

问题是您使用的是
[可选]
而不是可选参数的C语言集成。就语言而言(就方法声明部分而言),
num1
是必需的参数,因此它必须位于
optInput
之前。编译器在使用方法时确实知道
OptionalAttribute
,但在声明方法时却不知道

假设您希望这两个参数都是可选的,请对这两个参数使用语言集成:

publicstringuseranswer(stringoptinput=null,intnum1=0)

我强烈建议不要显式地使用
OptionalAttribute
,因为现在有了语言支持,没有理由这样做,而且在其他人阅读代码时,这样做更容易造成混乱,而不是帮助他们。

制作方法标题

public string UserAnswer(string optInput = null, int num1 = 0)

使您的方法成为标题

public string UserAnswer(string optInput = null, int num1 = 0)

函数签名中具有赋值的任何参数都是可选参数。它们不需要具有可选属性

public string UserAnswer(string optInput = null, int num1 = 0)
在本例中,optInput和num1都是可选的。离开你的房间


我希望num1和num2s是可选的,因为它们可以 如果为它们输入了值,则使用,否则请使用console.readline

我们不能这样做。但是我们可以用一种更简单的方式来改变我们的参数。我们可以使整数为空

public string UserAnswer(string optInput = null, int? num1 = null)

这样,我们只能在值不为null时使用该值。当任何有效整数被视为有效输入,并且我们需要一种方法来确定是否提供了参数时,这非常有用

函数签名中具有赋值的任何参数都是可选参数。它们不需要具有可选属性

public string UserAnswer(string optInput = null, int num1 = 0)
在本例中,optInput和num1都是可选的。离开你的房间


我希望num1和num2s是可选的,因为它们可以 如果为它们输入了值,则使用,否则请使用console.readline

我们不能这样做。但是我们可以用一种更简单的方式来改变我们的参数。我们可以使整数为空

public string UserAnswer(string optInput = null, int? num1 = null)


这样,我们只能在值不为null时使用该值。当任何有效整数被视为有效输入,并且我们需要一种方法来确定是否提供了参数时,这非常有用

通过在第一行中设置
optInput=null
,意味着默认值,这意味着它是可选的,但没有为
num1
提供默认值。那么它们都是可选的吗?这是如何工作的…将尝试删除
[可选]
属性并为其提供默认值。。。或者将
[Optional]
添加到两个参数并删除值。相关:@Josh:
Optional
属性可以做到这一点,但最好使用语言集成。请参见“是的,它确实引入了编译器在调用该方法时可以识别的可选参数”的示例。通过在第一行中设置
optInput=null
,您暗示了一个默认值,这意味着它是可选的,但没有为
num1
提供默认值。那么它们都是可选的吗?这是如何工作的…将尝试删除
[可选]
属性并为其提供默认值。。。或者将
[Optional]
添加到两个参数并删除值。相关:@Josh:
Optional
属性可以做到这一点,但最好使用语言集成。请参见“是的,它确实引入了一个可选参数,编译器在调用该方法时可以识别该参数”的示例.是的,但当我这样做时-当我运行覆盖用户输入的程序时,它将我的num1和num2的值默认为0。我希望num1和num2s是可选的,因为如果为它们输入值,则可以使用它们,否则请使用控制台。readline@Jon飞碟回答得很好,我想添加一些关于
[可选]
属性的注释和有用信息。通过显式地使用该属性,编译器不会对类型要求强制执行相同的严格性;这本身可能是不好的。@đěxě341;:考虑到我鼓励OP根本不要使用它,我认为不值得详细讨论。@JonSkeet当然,只是关于为什么不使用它的更多细节。是的,但当我这样做时-当我运行覆盖我的用户输入的程序时,它将我的num1和num2的值默认为0。我希望num1和num2s是可选的,因为如果为它们输入值,则可以使用它们,否则使用控制台。readline@Jon飞碟回答得很好,我想添加一些关于
[可选]
属性的注释和有用信息。通过显式地使用该属性,编译器不会对类型要求强制执行相同的严格性;这本身可能很糟糕。@đěxě341;:鉴于我鼓励OP根本不使用它,我不认为