当我实现从int到我的类型的强制转换运算符时,它似乎"自动地";也支持从浮子铸造。我不希望我的类型是从float中隐式铸造的!我甚至不希望它是从float显式转换的(从float定义显式转换还不够好(。
我能阻止这种行为吗?有什么说明吗?
原因:我正在尝试学习/探索确定性定点数学,从float转换通常是";危险区域";。Int强制转换很好,需要是隐式的。在需要浮点转换的情况下,我更喜欢静态方法来更好地指定意图,例如:MyNumber.ParseUnsafe(0.1f)
。
public struct MyNumber
{
public int raw;
public static implicit operator MyNumber(int x)
{
return new MyNumber { raw = x * 10 };
}
}
public static class Test
{
public static void TestSomething()
{
MyNumber num = (MyNumber)0.1f; // This must be compiler error, but it isn't!
}
}
语言规范说:
用户定义的显式转换包括可选的标准显式转换,然后执行用户定义的隐式或显式转换运算符,然后执行另一个可选的标准隐式转换。
因此存在从float
到MyNumber
的显式转换。它是一个";用户定义显式转换";,包括从float
到int
的转换(这是"标准显式转换"(,然后执行隐式转换运算符。
本节将对此进行更详细的解释。
尝试阻止这种情况的一个想法是尝试找到一个类型T
,这样就有一个从int
到T
的标准显式转换,而不是从float
到T
的标准显型转换,这也不会丢失信息。我想不出这样的类型,我认为这不太可能存在:(