動態語言與靜態語言本質上是「協議」(動)與「約束」(靜)兩種元素的作用。C# 融合雙方優勢,善用可呈現動靜結合之美。
void B() {
ArrayList lst = A();
foreach (string item in lst) {
Console.WriteLine(item.Length);
}
}
方法 B 假定方法 A 回傳的 ArrayList 內部皆為 string。這是「協議」——運行時不確定性,A 可能塞入非 string 導致 B 拋出例外。
void B() {
List<string> lst = A();
foreach (string item in lst) {
Console.WriteLine(item);
}
}
泛型為 A 加上靜態型別約束,編譯期保證 lst 內皆為 string,消除運行時風險。
介面是靜態型別約束;委派僅是靜態簽名約束。委派具更多「協議性」——符合簽名即可調用;介面要求物件必須實作該介面。二者約束強度截然不同。