簡體   English   中英

C# 隱式運算符 MyType(int value) 自動“支持”從浮點數轉換

[英]C# implicit operator MyType(int value) automatically "supports" cast from float

當我實現從 int 到我的類型的轉換運算符時,它似乎“自動”支持從 float 進行轉換。 我不希望我的類型從浮點數隱式轉換。 我什至不希望它從 float 顯式轉換(從 float 定義顯式轉換還不夠好)。

我可以防止這種行為嗎? 是否有一些規范解釋這一點?

原因:我正在嘗試學習/探索確定性定點數學,而從浮點數進行的強制轉換通常是“危險區域”。 Int 強制轉換很好,需要是隱式的。 在需要浮點轉換的情況下,我更喜歡 static 方法來更好地指定意圖,例如: 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 ,這也不會丟失信息。 我想不出這種類型,而且我認為這不太可能存在:(

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM