C# 无法在ValueTuple中使用[AllowNull]
我有这样的代码:C# 无法在ValueTuple中使用[AllowNull],c#,c#-8.0,C#,C# 8.0,我有这样的代码: public void F(int i, (int k, object v) tuple) { ... } 我试图使这段代码在C#8.0和C#7.3中编译时不出现错误或警告 由于v可以为null,我尝试了: public void F(int i, (int k, [AllowNull] object v) tuple) { ... } 然而,我得到: 错误CS0270无法在变量声明中指定数组大小(请尝试使用“新”表达式初始化) 这对我来说毫无意义 (请
public void F(int i, (int k, object v) tuple) { ... }
我试图使这段代码在C#8.0和C#7.3中编译时不出现错误或警告
由于v可以为null,我尝试了:
public void F(int i, (int k, [AllowNull] object v) tuple) { ... }
然而,我得到:
错误CS0270无法在变量声明中指定数组大小(请尝试使用“新”表达式初始化)
这对我来说毫无意义
(请注意,如果我删除值tuplepublic void F(inti,intk,[AllowNull]object v tuple){…}
一切正常)
值元组参数和[AllowFull]是否存在特殊问题?有什么办法可以解决这个问题吗?那么
(int k,object?v)
?不能将属性放在值元组的成员上。?
语法调用编译器的不同部分,以不同的方式处理此问题,将其提升到参数上的属性(在本例中),编译器将携带可空性的知识,但类型(使用的ValueTuple类型)没有这些属性的概念。所以基本上,?
得到了特殊的处理,而属性却没有。在启用可为null的引用类型之前,变量被认为是可为null的。启用可为null的引用类型后,所有这些变量都不可为null。如果这些变量未初始化为非空值,编译器将发出警告。另一个可能的警告来源是当值尚未初始化时返回值。@LasseV.Karlsen谢谢!但如果我使用?当禁用nullable时,它将发出警告(警告CS8632 nullable引用类型的注释只能在'#nullable'注释上下文中的代码中使用。)我相信你是对的,如果没有out#if指令,你就做不到。关于(int k,object?v)
,你不能将属性放在值元组的成员上。?
语法调用编译器的不同部分,以不同的方式处理此问题,将其提升到参数上的属性(在本例中),编译器将携带可空性的知识,但类型(使用的ValueTuple类型)没有这些属性的概念。所以基本上,?
得到了特殊的处理,而属性却没有。在启用可为null的引用类型之前,变量被认为是可为null的。启用可为null的引用类型后,所有这些变量都不可为null。如果这些变量未初始化为非空值,编译器将发出警告。另一个可能的警告来源是当值尚未初始化时返回值。@LasseV.Karlsen谢谢!但如果我使用?当禁用nullable时,它将发出警告(警告CS8632可nullable引用类型的注释应仅在“#nullable”注释上下文中的代码中使用)。我相信您是对的,如果没有out#if指令,您将无法做到这一点。