7

次のコードが機能しないのはなぜですか。

endDate.AddDays(7-endDate.DayOfWeek);

これは:

endDate.AddDays(0-endDate.DayOfWeek + 7);

(「機能しない」とは、次のコンパイルエラーが発生することを意味します:「'System.DayOfWeek'から'double'に変換できません」)

4

3 に答える 3

12

ラッセが言ったことを拡張する (というか、もう少し明確にする)。

0 は Enum 型に変換できるため、

0 - endDate.DayOfWeek becomes 
(DayOfWeek)0 - endDate.DayOfWeek

また、ある列挙型から別の列挙型を減算して、整数の差を取得できるため:

(DayOfWeek)0 - endDate.DayOfWeek == (int)endDate.DayOfWeek

したがって、減算の結果は int なので、それに 7 を加算できます。

endDate.AddDays(0-endDate.DayOfWeek + 7);

したがって、月曜日の Enum 値が 1 の場合

0 - endDate.DayOfWeek == -1 + 7 == 6

ただし、逆はできません。

endDate.DayOfWeek - 0 + 7, 

計算の結果の型は左端に依存するためです。したがって、0 - endDate.DayOfWeek は整数になりますが、endDate.DayOfWeek - 0 は列挙 DayOfWeek になります。

最も興味深いことに、この副作用を使用して、キャストせずに列挙型の値を取得できますが、これはハックで紛らわしいと思います... したがって、回避する必要があります。

int enumValue = -(0 - endDate.DayOfWeek);
于 2009-06-04T17:50:59.077 に答える
4

これはとても興味深いです。これを行う正しい方法は次のとおりです。

endDate.AddDays(7 - (int)endDate.DayOfWeek);

しかし、あなたの質問は解決策ではなく、行動の理由です。これは、コンパイラがゼロを処理する方法と関係があります。ゼロが存在しない場合はどちらかの行が失敗し、ゼロが存在する場合は両方の行が機能します。

于 2009-06-04T17:28:16.630 に答える
4

2 つの列挙値を減算して、整数値の差を取得できます。

using System;

namespace ConsoleApplication10
{
    public enum X { A, B, C, D }
    public class Program
    {
        static void Main()
        {
            var x = X.D + X.A;
            Console.Out.WriteLine(x);
            Console.In.ReadLine();
        }
    }
}

3を出力します。

しかし、追加することはできません。おそらく意味がありません。

「0」の場合、0 はすべての列挙型に自動変換可能であるため、基本的に「0 - 列挙値」は「(列挙型)0 - 列挙値」と同じ意味で、これも機能します。

于 2009-06-04T17:43:23.517 に答える