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根本不使用它,我不认为