次のコードが機能しないのはなぜですか。
endDate.AddDays(7-endDate.DayOfWeek);
これは:
endDate.AddDays(0-endDate.DayOfWeek + 7);
?
(「機能しない」とは、次のコンパイルエラーが発生することを意味します:「'System.DayOfWeek'から'double'に変換できません」)
ラッセが言ったことを拡張する (というか、もう少し明確にする)。
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);
これはとても興味深いです。これを行う正しい方法は次のとおりです。
endDate.AddDays(7 - (int)endDate.DayOfWeek);
しかし、あなたの質問は解決策ではなく、行動の理由です。これは、コンパイラがゼロを処理する方法と関係があります。ゼロが存在しない場合はどちらかの行が失敗し、ゼロが存在する場合は両方の行が機能します。
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 - 列挙値」と同じ意味で、これも機能します。