【发布时间】:2021-12-27 16:10:30
【问题描述】:
我有一个泛型类型T 的数组,我想检查长度是否为0。但是,我打错了,而不是Array.Length is 0,我输入了Array is 0。当我注意到这个错字时,我想知道为什么它没有给我一个编译时错误,当我使用任何具体类型的数组(如string、int、object,甚至dynamic。显然,无论数组的底层类型是什么,数组都不能是int 值为零,所以这是值得怀疑的。我尝试了各种其他 int 文字、字符串文字,我什至尝试了小于和大于模式,所有这些都奏效了。我尝试更改数组的维度或可空性(因为我的原始示例是 T[,]?),我什至尝试向 T 泛型类型添加一些约束,但没有任何改变。
是否存在一些特殊情况,这些模式实际上可以匹配(即使我无法想象,因为它们仍然只是数组),还是编译器错误?如果是后者,是什么原因造成的?
由于有人要求提供代码,因此这是一个简单的测试,它给了我相同的结果: (假设 T 是任何泛型类型)
T[] array = new T[42];
// You can assign anything here
// Only thing that matters is that the variable is a T[] with any number of dimensions
if (array is 0 or "test") Console.WriteLine("This shouldn't even compile")
【问题讨论】:
-
您没有收到编译时错误,因为
is进行了运行时检查。见docs.microsoft.com/en-us/dotnet/csharp/language-reference/… -
理论上编译器可以给你一个错误,因为给定
public static bool Test<T>(T[] a)然后a is 0永远没有意义。 -
@MatthewWatson 当然它可能给我一个错误,它应该,但它确实'不。那是我的问题。
-
@VicF 但它确实给我任何非泛型数组的错误。在那里有所作为甚至没有意义。数组就是数组。
-
@Nyde 这就是我的意思——它可以,但它没有。 Resharper 警告您:
"The source expression never matches the provided pattern".
标签: c# arrays pattern-matching