Здравствуйте, VladD2, Вы писали:
VD>На то у типов есть свойство FullName. А пытаться сравнивать экземпляры типа Type вообще опасно, так как они могут представлять типы загруженные из разных сборок. При этом казалось бы одинаковые типы не будут считаться идентичными.
Спасибо за ответ, все таки кажется редкой такая ситуация когда могут быть загружены одинаковые типы из разных сборок, это скорее исключительная ситуация, а чаще приходится сравнивать встроенные типы, которые соответствуют одной версии типа в библиотечной сборке, может вы подскажите или дадите ссылку когда такая ситуация может встречаться, потому что на данный момент в C# только так и поступаю, сначала пробовал именно тот вариант с сравнением имени, но это сказывается на производительности, ведь сравнение двух строк в реальном времени не такая простая операция как сравнение двух ссылок, при том что по определению CLR ссылки Type оригинальны для каждого типа и равны для одинаковых типов. Поэтому все же вариант с when кажется более приемлемым, но прошу разъяснить ситуацию в потребности избегать сравнения ссылок через сравнение имен.
VD>Можно конечно делать так:
VD>VD>def CheckType(t : Type)
VD>{
VD> | _ when t.Equals(typeof(bool)) => ...
VD> | _ when t.Equals(typeof(byte)) => ...
VD> | _ when t.Equals(typeof(int)) => ...
VD>}
VD>
VD>Собсвтенно паттерн "is" как раз без проблем можно использоать:
VD>VD>def CheckType(_ : object)
VD>{
VD> | x is bool => // здесь x имеет тип bool
VD> | x is byte => // здесь x имеет тип byte
VD> | x is int => // здесь x имеет тип int
VD> | _ => // в ином случае ...
VD>}
VD>
действительно простота оператора is ощутима,
VD>Но зачем так извращаться когда можно просто сравнивать имя?
VD>Ведь так проще:
VD>[c#]
VD>def сheckType(t : Type)
VD>{
VD> match (t.FullName)
VD> {
VD> | "System.Bool" => WriteLine("bool");
VD> | "System.Byte" => WriteLine("byte");
VD> | "System.Int32" => WriteLine("int");
VD> | _ => WriteLine("xz")
VD> }
VD>}