使用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) {}
答案 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?));