C# 7.3

 

一、ref local variables may be reassigned

在 C# 7.2 是不支援 ref reassignment

 

在 C# 7.3 已可支援了

using System;

namespace ConsoleApp1
{
    class Program
    {
        static void Main(string[] args)
        {
            int input = 100;
            int input2 = 200;

            ref int result = ref input;
            result = ref input2;

            Console.WriteLine(result);
        }
    }
}

結果畫面為

 

二、Enhanced generic constraints

在 C# 7.3 「泛型限制」還增加了 System.Enum、System.Delegate 可用。

 

System.Enum

using System;

namespace ConsoleApp1
{
    class Program
    {
        static void Main(string[] args)
        {
            ShowEnumContext<Rainbow>();
        }

        public static void ShowEnumContext<T>() where T : System.Enum
        {
            var values = Enum.GetValues(typeof(T));

            foreach (int item in values)
            {
                Console.WriteLine(Enum.GetName(typeof(T), item));
            }
        }

        enum Rainbow
        {
            Red,
            Orange,
            Yellow,
            Green,
            Blue,
            Indigo,
            Violet
        }
    }
}

結果畫面為

 

System.Delegate

using System;

namespace ConsoleApp1
{
    class Program
    {
        public delegate string helloDelegate(string pName);

        static void Main(string[] args)
        {
            helloDelegate myHelloDelegate = ReturnMessage;

            ShowEnumContext(myHelloDelegate);

            //string message = myHelloDelegate("a");
            //Console.WriteLine(message);                   
        }

        public static string ReturnMessage(string pName)
        {
            return pName;
        }

        public static void ShowEnumContext<T>(T t) where T : System.Delegate
        {
            Console.WriteLine(t.Method.Name);
        }
    }
}

結果畫面為

 

三、Tuples support == and !=

在 C# 7.3 Tuples 也可以互相比較了。

using System;

namespace ConsoleApp1
{
    class Program
    {
        static void Main(string[] args)
        {
            var a = (1, "Tom");
            var b = (1, "Tom");
            Console.WriteLine(a == b ? "equal" : "unequal");

            b = (1, "Bill");
            Console.WriteLine(a != b ? "unequal" : "equal");
        }
    }
}

結果畫面為

 

四、Extend expression variables in initializers

在 C# 7.3 out 參數修飾詞也可以支援 field initializers、

property initializers、constructor initializers。

using System;

namespace ConsoleApp1
{
    class Program
    {
        static void Main(string[] args)
        {
            D foo = new D(100);
        }
    }

    public class B
    {
        public B(int i, out int j)
        {
            j = i;
        }
    }

    public class D : B
    {
        public D(int i) : base(i, out var j)
        {
            Console.WriteLine($"The value of 'j' is {j}");
        }
    }
}

結果畫面為

說明:

上例為 constructor initializers,class D 想要存取 class B 基礎類別建構子時,

需加上「out var」或「out int」(如黃色框框)。