c#2.0中可为空值的默认值

时间:2011-11-21 17:01:54

标签: c# .net c#-2.0

使用C#2.0,我可以指定默认参数值,如下所示:

static void Test([DefaultParameterValueAttribute(null)] String x) {}

由于此C#4.0语法不可用:

static void Test(String x = null) {}

那么,值类型的C#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) {}

5 个答案:

答案 0 :(得分:14)

不幸的是,旧版本的C#编译器不支持此功能。

C#4.0编译器编译:

public static void Foo(int? value = null)

分为:

public static void Foo([Optional, DefaultParameterValue(null)] int? value)

这实际上与您第一次尝试(另外添加OptionalAttribute)相同,C#2编译器在CS1908上出错,因为在该版本的编译器中不直接支持。< / p>

如果您需要支持C#2,在这种情况下,我建议您添加重载方法:

static void Test()
{
    Test(null);
}
static void Test(int? x)
{
    // ..

答案 1 :(得分:10)

里德当然是正确的;我只是想我会在一个角落案例中添加一个有趣的事实。在C#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)) {}

在前三种情况下,我们可以简单地发出“可选值是形式参数类型的默认值”的元数据。但在第四种情况下,可选值是不同类型的默认值 。没有一种明显的方法可以将这种事实编码到元数据中。我们只是在C#中将其设置为非法,而不是针对如何编码这样的事实提出跨语言的一致规则。这可能是一个罕见的角落案件,所以没有太大的损失。

答案 2 :(得分:2)

显然你不能使用这个属性。

如您所知,属性参数在编译时被“序列化”为元数据 - 因此您需要持续表达式。由于编译器不喜欢'null',因此你没有选择。

您可以做的是 - 重载 - 定义另一个没有参数的Text方法,该方法使用null

调用Text方法

答案 3 :(得分:0)

这是否有效:[DefaultParameterValueAttribute((int?)null)]? 尝试过 - 这也行不通(

答案 4 :(得分:0)

我认为应该是:

static void Text(int? x = default(int?));