Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/string/5.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 无法在ValueTuple中使用[AllowNull]_C#_C# 8.0 - Fatal编程技术网

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无法在变量声明中指定数组大小(请尝试使用“新”表达式初始化)

这对我来说毫无意义

(请注意,如果我删除值tuple
public 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指令,您将无法做到这一点。