Я просто снова наткнулся на System.Decimal
и попросил объяснить.
При выдаче значения типа System.Decimal
для какого-либо другого типа (то есть System.Int32
) ключевое слово checked
и -checked
компилятора -checked
похоже, игнорируются.
Для демонстрации ситуации я создал следующий тест:
public class UnitTest
{
[Fact]
public void TestChecked()
{
int max = int.MaxValue;
// Expected if compiled without the -checked compiler option or with -checked-
Assert.Equal(int.MinValue, (int)(1L + max));
// Unexpected
// this would fail
//Assert.Equal(int.MinValue, (int)(1M + max));
// this succeeds
Assert.Throws<OverflowException>(() => { int i = (int)(1M + max); });
// Expected independent of the -checked compiler option as we explicitly set the context
Assert.Equal(int.MinValue, unchecked((int)(1L + max)));
// Unexpected
// this would fail
//Assert.Equal(int.MinValue, unchecked((int)(1M + max)));
// this succeeds
Assert.Throws<OverflowException>(() => { int i = unchecked((int)(1M + max)); });
// Expected independent of the -checked compiler option as we explicitly set the context
Assert.Throws<OverflowException>(() => { int i = checked((int)(1L + max)); });
// Expected independent of the -checked compiler option as we explicitly set the context
Assert.Throws<OverflowException>(() => { int i = checked((int)(1M + max)); });
}
}
Все мои исследовательские подразделения теперь не привели к надлежащему объяснению этого явления или даже некоторой дезинформации, заявляющей, что она должна работать. Мои исследования уже включали спецификацию С#
Есть ли там кто-нибудь, кто может пролить свет на это?