После использования параметра [Необязательно] в c# как узнать, был ли он задан вызывающим методом или нет?

#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. Очевидно, что я использую разные методы для этого каждый день, но мне было любопытно, смогу ли я как-то легко сделать то же самое таким образом. Как я понимаю до сих пор, я не могу.