Если честно, на практике обычно нет разницы между System.String и string .
Все типы в C # являются объектами и все являются производными от System.Object class. Единственное отличие состоит в том, что строка - это ключевое слово C # и String , которые вы можете использовать в качестве имени переменной. System.String - это стандартное имя .NET этого типа, а строка - удобное имя C #. Вот простая программа, которая представляет разницу между System.String и строкой.
string a = new string(new char[] { 'x', 'y', 'z' });
string b = new String(new char[] { 'x', 'y', 'z' });
String c = new string(new char[] { 'x', 'y', 'z' });
String d = new String(new char[] { 'x', 'y', 'z' });
MessageBox.Show((a.GetType() == typeof(String) && a.GetType() == typeof(string)).ToString()); // shows true
MessageBox.Show((b.GetType() == typeof(String) && b.GetType() == typeof(string)).ToString()); // shows true
MessageBox.Show((c.GetType() == typeof(String) && c.GetType() == typeof(string)).ToString()); // shows true
MessageBox.Show((d.GetType() == typeof(String) && d.GetType() == typeof(string)).ToString()); // shows true
@ JonSkeet в моем компиляторе
public enum Foo : UInt32 { }
работает. У меня сообщество Visual Studio 2015.