C# 在C中同时使用可空类型和空合并运算符?

C# 在C中同时使用可空类型和空合并运算符?,c#,linq,null-coalescing-operator,C#,Linq,Null Coalescing Operator,在以下关于的MSDN官方文章中,作者正在一起使用和…选择新的{person.FirstName,PetName=subset?.Name??String.Empty};。问题:为什么不直接使用??as:选择新的{person.FirstName,PetName=subset.Name??String.Empty};我认为,这会转化为,如果subset.Name为null,则给我一个空字符串。我是不是误解了什么 询问原因:我什么时候用的?和在我的代码中一起解释了VS2015 Intellisens

在以下关于的MSDN官方文章中,作者正在一起使用和…选择新的{person.FirstName,PetName=subset?.Name??String.Empty};。问题:为什么不直接使用??as:选择新的{person.FirstName,PetName=subset.Name??String.Empty};我认为,这会转化为,如果subset.Name为null,则给我一个空字符串。我是不是误解了什么

询问原因:我什么时候用的?和在我的代码中一起解释了VS2015 Intellisense给我的错误,在那篇文章中也有解释

class Person
{
    public string FirstName { get; set; }
    public string LastName { get; set; }
}

class Pet
{
    public string Name { get; set; }
    public Person Owner { get; set; }
}

public static void LeftOuterJoinExample()
{
    Person magnus = new Person { FirstName = "Magnus", LastName = "Hedlund" };
    Person terry = new Person { FirstName = "Terry", LastName = "Adams" };
    Person charlotte = new Person { FirstName = "Charlotte", LastName = "Weiss" };
    Person arlene = new Person { FirstName = "Arlene", LastName = "Huff" };

    Pet barley = new Pet { Name = "Barley", Owner = terry };
    Pet boots = new Pet { Name = "Boots", Owner = terry };
    Pet whiskers = new Pet { Name = "Whiskers", Owner = charlotte };
    Pet bluemoon = new Pet { Name = "Blue Moon", Owner = terry };
    Pet daisy = new Pet { Name = "Daisy", Owner = magnus };

    // Create two lists.
    List<Person> people = new List<Person> { magnus, terry, charlotte, arlene };
    List<Pet> pets = new List<Pet> { barley, boots, whiskers, bluemoon, daisy };

    var query = from person in people
                join pet in pets on person equals pet.Owner into gj
                from subpet in gj.DefaultIfEmpty()
                select new { person.FirstName, PetName = subpet?.Name ?? String.Empty };

    foreach (var v in query)
    {
        Console.WriteLine($"{v.FirstName+":",-15}{v.PetName}");
    }
}

// This code produces the following output:
//
// Magnus:        Daisy
// Terry:         Barley
// Terry:         Boots
// Terry:         Blue Moon
// Charlotte:     Whiskers
// Arlene:

正如@Lee所提到的,子集可能为空。所以,在调用subset.Name时抛出一个异常。因此??检查子集是否为空,以及?回到calling.Name属性。

您没有误解。程序员正在测试子集是否为null,因为

在表达式中

    subpet?.Name ?? String.Empty 
子集可以为null,在这种情况下,子集?的名称也可以为null。 String.Empty可以缩短为 因此,为了确保非空字符串

    subpet?.Name ?? ""

如果子集为空,则子集.Name将抛出。子集?.Name??String.Empty将计算为空字符串,无论子集是null还是子集.Name是空字符串null@SirRufo我的困惑是由于一个错误,我在我的一个代码中得到解释。但我认为@JonSkeet和@hvd已经在那个帖子上解释过了。所以。。。“这是误会吗?”布法杰普。谢谢你的解释。但我确实误解了正确使用?和请看我的另一个SO问题,这促使我发布上述问题。好的,没问题。我觉得你好像在问为什么要用?。接线员在这里,而不是接线员做什么?谢谢。另外,请看我的评论以上的原因,我的问题。