【问题标题】:C# implicit operator MyType(int value) automatically "supports" cast from floatC# 隐式运算符 MyType(int value) 自动“支持”从浮点数转换
【发布时间】:2022-01-20 23:44:38
【问题描述】:

当我将转换运算符从 int 实现为我的类型时,它似乎“自动”支持从 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!
    }
}

【问题讨论】:

  • 这一定是编译器错误 - 如果你使用不适合 int 的浮点数

标签: c# .net type-conversion integer implicit-conversion


【解决方案1】:

The language specification 说:

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

所以floatMyNumber 的显式转换。它是一种“用户定义的显式转换”,包括从floatint 的转换(这是一种“标准显式转换”),然后执行隐式转换运算符。

This section explains this in more detail.

试图阻止这种情况的一个想法是尝试找到一个类型T,这样有一个从intTstandard explicit conversion,但不是从floatT,即也不会丢失信息。我想不出这种类型,而且我认为这不太可能存在:(

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2013-06-11
    • 2010-10-27
    • 1970-01-01
    • 2021-01-05
    • 1970-01-01
    • 2011-01-27
    • 2013-08-25
    • 1970-01-01
    相关资源
    最近更新 更多