#c# #optional-parameters
Вопрос:
Я хочу знать, был ли параметр b предоставлен вызывающим методом или нет, чтобы я мог определить его в соответствии с определением метода в соответствии с ним. Поскольку здесь всегда есть значение по умолчанию «b» 0, но я хочу различать, когда пользователь вызывает cc(5,0) и cc(5).
Есть ли какой-нибудь способ узнать это?
class Program
{
static void Main(string[] args)
{
var c= cc(5);
}
public static int cc(int a, [Optional] int b)
{
int c=0;
//if(b is provided)
c = a * b;
//else()
c =a*a;
return c;
}
}
Комментарии:
1. nit: идиоматический способ выражения необязательных параметров в C# заключается в следующем:
public static int cc(int a, int b = 0)
— результат в основном одинаков в любом случае, обратите внимание
Ответ №1:
Вы не можете с помощью этого механизма. Даже если вы использовали int? b = null
, вызывающий мог явно указать null
. Чтобы знать это, вам придется использовать перегрузки вместо необязательных параметров, например:
public static int cc(int a) => cc(a, 0, false);
public static int cc(int a, int b) => cc(a, b, true);
private static int cc(int a, int b, bool bSpecified) // could also use int? here
{...}
Ответ №2:
Когда вы пишете метод с необязательными аргументами. Компилятор вставит значения аргументов по умолчанию на сайте вызова.
public static int cc(int a, int b = 0){...}
// these are exactly the same at runtime;
cc(5);
cc(5,0);
В то время как вы могли бы использовать другое магическое значение int b = Int32.MinValue
, или int? b = default
. Поскольку вам все равно нужно другое поведение, почему бы просто не написать два метода;
public static int cc(int a, int b) => a*b;
public static int cc(int a) => a*a;
// these are now calling different methods;
cc(5);
cc(5,0);
Комментарии:
1. Очевидно, что я использую разные методы для этого каждый день, но мне было любопытно, смогу ли я как-то легко сделать то же самое таким образом. Как я понимаю до сих пор, я не могу.