I have these two overloaded method definitions:
string[] Test1(string data)
and
string[] Test1(params string[] input)
When I call Test1("Single test data")
with the intention of calling the second method, the first method gets called.
Why doesn't the compiler flag this scenario like it would for more obvious overload conflict scenarios?
Why doesn't the compiler flag this scenario like it would for more obvious overload conflict scenarios?
Because the language rules tell it not to.
There's a very specific rule for this. From section 12.6.4.3 of the C# 7 spec:
Otherwise, if Mᵢ is applicable in its normal form and Mₑ has a params array and is applicable only in its expanded form, then Mᵢ is better than Mₑ.
In this case, your first method is applicable in its normal form, and your second method is applicable only in its expanded form, therefore the first method is better than the second method.