На РСДН-е задали довольно интересный вопрос на тему того, почему для преобразования из числа в значение из enum-а необходимо городить следующую конструкцию:
вместо того что бы писать
Прежде всего надо учитывать, что приведение типов с помощью
use std::int;
#[deriving(FromPrimitive)] // (1)
enum MyType {
Val1 = 0,
Val2 = 1,
Val3 = 10
}
fn main() {
let val1: Option<MyType> = FromPrimitive::from_int(1); // (2)
let val2: Option<MyType> = FromPrimitive::from_int(2); // (3)
println!("{:?}, {:?}", val1, val2);
}
Где объявляем возможность приведения целочисленных типов к
А теперь к примеру с
В то время как гарантировать преобразование от числового значения к нашему типу мы не можем.
после использования .NET, такое поведение достаточно странное и неожиданное
Чем именно оно странное?
падением.
в dotnet’е ведь можно как угодно “целое enum” переводить без исключений
И что .NET выдаст в случае (3)?
в дотнете вот как-то вот так работает
http://f6.s.qip.ru/13ASQb2JQ.jpg
т.е. рантайм не ломается, если что
.NET не дает жесткой гарантии что тип преобразовался корректно, в то время как Rust дает гарантии по допустимости всех преобразований на этапе компиляции. Вот и вся разница