3

ユーザー定義の暗黙的な変換を定義できる場合、定義する必要がある場合、または定義する必要がない場合の一般的なガイドラインは何ですか?

たとえば、「暗黙的な変換は情報を失うことはありません」、「暗黙的な変換は例外をスローすることはありません」、「暗黙的な変換は新しいオブジェクトをインスタンス化することはありません」などのことを意味します。最初のものは正しいと確信していますが、3 番目のものはそうではありません (または、構造体への暗黙的な変換しかできませんでした)。2 番目のものについてはわかりません。

4

4 に答える 4

14

1 つ目は、期待するほど単純ではありません。次に例を示します。

using System;

class Test
{
    static void Main()
    {
        long firstLong = long.MaxValue - 2;
        long secondLong = firstLong - 1;

        double firstDouble = firstLong;
        double secondDouble = secondLong;

        // Prints False as expected
        Console.WriteLine(firstLong == secondLong);

        // Prints True!
        Console.WriteLine(firstDouble == secondDouble);        
    }
}

個人的には、独自の暗黙的な変換を作成することはほとんどありません。フレームワークに含まれているものには十分満足していますが、独自のものを追加することで生活が良くなるとはほとんど感じません. (同じことが一般的な値型にも当てはまります。)

編集:実際に質問に少し答えるために、Microsoft クラス ライブラリ設計ガイドラインの変換演算子の部分を読む価値があるでしょう。

于 2008-12-23T21:45:37.687 に答える
2

私は最初のものには間違いなく同意します-2番目はほとんどの場合(「絶対に言わない」)ですが、3番目には興奮しません。何よりも、構造体とクラスの間に不必要な区別を作成します。場合によっては、暗黙的な変換を行うことで、呼び出し規約を大幅に簡素化できます。

明示的な変換の場合、すべてのことが可能です。

ただし、変換演算子を記述する必要があることはそれほど多くありません。そして、多くの場合、明示的な演算子は、条件が正しくない場合 (たとえば、Nullable<T>値がない場合) に壊れる可能性があることを受け入れて、より便利です。

于 2008-12-23T21:33:44.513 に答える
0

私がこの質問をする原因となったボーダーラインのケースは、2 番目のケースの違反です。つまり、私は Lazy<T> クラスを持っており (誰もがそうではありませんか?)、T への暗黙的な変換を提供するべきではないかどうかを熟考し始めました。私の本能はそう言うことであり、現在のバージョンでは提供されていますが、私もそうではありません。もちろん。

于 2008-12-23T22:01:02.867 に答える