Подтвердить что ты не робот

Значение по умолчанию для значения 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) {}
4b9b3361

Ответ 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?));