 
                                    In the context of generics, default initializes generic types with their default values.
The default value for a reference type is null and the default value of a value type is bitwise zero.
Example:
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
namespace HelloWorld
{
    class Program
    {
        static void Main(string[] args)
        {
            Console.WriteLine("default(int) is {0}", default(int));//0
            bool b1 = default(int) == null;//False
            Console.WriteLine("default(int) is null ?Answer: {0}", b1);
            Console.WriteLine("default(string) is {0}", default(string));
            //null
            bool b2 = (default(string) == null);//True
            Console.WriteLine("default(string) is  null ? Answer:{0}", b2);
            Console.ReadLine();
        }
    }
}Output:

?? operator is the null coalescing operator.
If the operand is non-null, ?? gets its value; otherwise, it returns a default value.
If the left hand expression is non-null, the right hand expression is never evaluated.
string s1 = null;
string s2 = s1 ?? "nothing"; // nothing is assigned to s2For example:
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
namespace HelloWorld
{
    class Program
    {
        static void Main(string[] args)
        {
            string s1 = null;
            string s2 = s1 ?? "XDevSpace is default value";
            Console.WriteLine(s2);
            Console.ReadLine();
        }
    }
}Output:

?. operator is the null-conditional or "Elvis" operator.
?. operator calls methods and access members like the standard dot operator.
If the operand on the left is null, the expression evaluates to null instead of throwing a NullReferenceException:
string sb = null;
string s = sb?.ToString();  // No error; s instead evaluates to nullThe last line is equivalent to:
string s = (sb == null ? null : sb.ToString());null conditional operator short-circuits the remainder of the expression.
string sb = null;
string s = sb?.ToString().ToUpper();// s evaluates to null without errorThe following expression deals with situation where both x being null and x.y are null:
x?.y?.zThe final expression must be capable of accepting a null. The following is illegal:
int length = sb?.ToString().Length;   // Illegal : int cannot be nullWe can fix this with the use of nullable value types.
int? length = sb?.ToString().Length;   // OK : int? can be nullYou can use the null-conditional operator to call a void method:
sb?.SomeVoidMethod();If sb is null, this becomes a "no-operation" rather than throwing a NullReferenceException.
You can use null conditional Operator with the null coalescing operator:
string s = sb?.ToString() ?? "nothing";   // s evaluates to "nothing"