C# 隐式运算符 MyType(int 值) 自动从浮点"supports"强制转换



当我实现从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!
}
}

语言规范说:

用户定义的显式转换包括可选的标准显式转换,然后执行用户定义的隐式或显式转换运算符,然后执行另一个可选的标准隐式转换。

因此存在从floatMyNumber的显式转换。它是一个";用户定义显式转换";,包括从floatint的转换(这是"标准显式转换"(,然后执行隐式转换运算符。

本节将对此进行更详细的解释。

尝试阻止这种情况的一个想法是尝试找到一个类型T,这样就有一个从intT的标准显式转换,而不是从floatT的标准显型转换,这也不会丢失信息。我想不出这样的类型,我认为这不太可能存在:(

最新更新