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」(如黃色框框)。