String.Join-参数和直接值的不同行为

时间:2019-06-24 10:58:30

标签: c# .net

我在下面运行代码,result1等于“”,但string.Join(“,”,null)抛出异常

string str = null;
var result1 = string.Join(",", str);
var result2 = string.Join(",", null);

同样不适用于此代码(引发异常)

.ForMember(dst => dst.Ids, opt => opt.MapFrom(string.Join(",", src.Ids)))

但是可以这样做:

.ForMember(dst => dst.Ids, opt => opt.MapFrom(src => src.Ids == null ? null : string.Join(",", src.Ids)))

如何解释这种行为?

3 个答案:

答案 0 :(得分:5)

两者都使用string.Join相同的重载-这是将字符串作为分隔符并将string[]作为值的重载。
更准确地说-params string[] value-这是观察到的差异行为的关键所在。

第一行代码-string.Join(",", str);,其中str是字符串的空引用,实际上被解析为string.Join("," new string[] {null})

但是第二行被解析为string.Join("," null)。 -表示字符串数组本身为null,因此将引发异常。

更新 使用自动映射器会得到不同的结果,因为以下代码的结果

string str = null;
var result1 = string.Join(",", str);

不为null,它是一个空字符串。

答案 1 :(得分:2)

用于连接的第二个参数采用params string[] value。在第一种情况下,您将发送具有1个值(空)的字符串数组。对于第二种情况,您将以null作为字符串数组发送。

答案 2 :(得分:2)

首次尝试

string str = null;
var result1 = string.Join(",", str);

上面的代码已转换为

string text = null;
string[] obj = new string[1];
string text2 = string.Join(",", obj);

第二次尝试

最后一行代码;

var result2 = string.Join(",", null);

翻译成;

string.Join(",", (string[])null);

您可以在看到自己 https://sharplab.io/#v2:CYLg1APgAgTAjAWAFBQMwAJboMLoN7LpGYZQAs6AsgBQCU+hxTjTRUcADOgM4AuATugC86AHYBXADaSA3MgBuAQ0H8Aptym84wzJwB0AKQD2AS1HUARABprPAbTlIlK9Zpg72HQ6fPXbE6QcWdABfZBCgA==

P.S:Sharplab是爱=)