Значение по умолчанию для значения NULL в С# 2.0
Используя С# 2.0, я могу указать значение параметра по умолчанию, например:
static void Test([DefaultParameterValueAttribute(null)] String x) {}
Поскольку этот синтаксис С# 4.0 недоступен:
static void Test(String x = null) {}
Итак, существует ли эквивалент С# 2.0 для типов значений? Например:
static void Test(int? x = null) {}
Следующие попытки не компилируются.
// error CS1908: The type of the argument to the DefaultValue attribute must match the parameter type
static void Test([DefaultParameterValueAttribute(null)] int? x) {}
// error CS0182: An attribute argument must be a constant expression, typeof expression or array creation expression
static void Test([DefaultParameterValueAttribute(new Nullable<int>())] int? x) {}
Ответы
Ответ 1
К сожалению, старые версии компилятора С# не поддерживают это.
Компилятор С# 4.0 компилирует это:
public static void Foo(int? value = null)
В:
public static void Foo([Optional, DefaultParameterValue(null)] int? value)
Это фактически то же самое, что и ваша первая попытка (добавлено OptionalAttribute
, кроме того), с которой ошибки компилятора С# 2 связаны с CS1908, поскольку это не поддерживалось непосредственно в этой версии компилятора.
Если вам нужно поддерживать С# 2, в этом случае я бы рекомендовал вместо этого добавить перегруженный метод:
static void Test()
{
Test(null);
}
static void Test(int? x)
{
// ..
Ответ 2
Рид, конечно, правильный; Я просто подумал, что добавлю интересный факт об угловом деле. В С# 4.0 вы можете сказать: (для типа структуры S)
void M1(S x = default(S)) {}
void M2(S? x = null) {}
void M3(S? x = default(S?)) {}
Но, как ни странно, вы не можете сказать
void M4(S? x = default(S)) {}
В первых трех случаях мы можем просто испустить метаданные, в которых говорится, что "необязательное значение является значением по умолчанию для формального типа параметра". Но в четвертом случае необязательным значением является значение по умолчанию для другого типа. Нет очевидного способа кодирования такого факта в метаданные. Вместо того, чтобы подходить к последовательному правилу на разных языках для кодирования такого факта, мы просто сделали его незаконным в С#. Вероятно, это редкий угловой случай, поэтому никаких больших потерь.
Ответ 3
По-видимому, вы не можете использовать этот атрибут.
Как вы знаете, параметры атрибута "сериализованы" для метаданных во время компиляции, поэтому вам нужно постоянное выражение. Поскольку компилятор не любит "null", у вас нет параметров.
Что вы можете сделать - перегрузка - определить другой текстовый метод без параметров, который вызывает ваш метод Text с нулевым
Ответ 4
Работает ли это: [DefaultParameterValueAttribute((int?)null)]
?
Пробовал - это тоже не работает (
Ответ 5
Я считаю, что это должно быть:
static void Text(int? x = default(int?));