Есть важная и тонкая проблема, которую ни один из них не решает напрямую. Существует два способа рассмотрения типа в C #: статический тип и тип времени выполнения .
Статический тип - это тип переменной в вашем исходном коде. Следовательно, это концепция времени компиляции. Это тип, который вы видите во всплывающей подсказке при наведении курсора на переменную или свойство в среде разработки.
Вы можете получить статический тип, написав вспомогательный универсальный метод, чтобы выведение типов позаботилось об этом за вас:
Type GetStaticType<T>(T x) { return typeof(T); }
Тип времени выполнения - это тип объекта в памяти. Следовательно, это концепция времени выполнения. Это тип, возвращаемый GetType()методом.
Тип времени выполнения объекта часто отличается от статического типа переменной, свойства или метода, которые содержат или возвращают его. Например, у вас может быть такой код:
object o = "Some string";
Статический тип переменной - это object, но во время выполнения тип референта переменной - string. Таким образом, следующая строка выведет на консоль "System.String":
Console.WriteLine(o.GetType());
Но если вы наведете курсор на переменную oв своей среде разработки, вы увидите тип System.Object(или эквивалентное objectключевое слово). Вы также видите то же самое, используя нашу вспомогательную функцию сверху:
Console.WriteLine(GetStaticType(o));
Для переменного значения типа, такие как int, double, System.Guid, вы знаете , что тип во время выполнения всегда будет таким же , как статические, так как типы значений не могут служить в качестве базового класса для другого типа; тип значения гарантированно будет наиболее производным типом в его цепочке наследования. Это также верно для запечатанных ссылочных типов: если статический тип является запечатанным ссылочным типом, значение времени выполнения должно быть либо экземпляром этого типа, либо null.
И наоборот, если статический тип переменной является абстрактным типом, то гарантируется, что статический тип и тип среды выполнения будут разными.
Чтобы проиллюстрировать это в коде:
int i = 0;
Console.WriteLine(i.GetType() == typeof(int));
string s = "Foo";
Console.WriteLine(s == null || s.GetType() == typeof(string));
object o = new FileInfo("C:\\f.txt");
Console.WriteLine(o == null || o.GetType() == typeof(object));
FileSystemInfo fsi = new DirectoryInfo("C:\\");
Console.WriteLine(fsi == null || fsi.GetType() == typeof(FileSystemInfo));
int