Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/321.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# SEHException.net难题_C#_.net_Puzzle - Fatal编程技术网

C# SEHException.net难题

C# SEHException.net难题,c#,.net,puzzle,C#,.net,Puzzle,有人能解释为什么下面的代码会抛出错误吗。可以通过将-1值强制转换为十进制(-1M)、将运算符重载更改为接受int或不使用可为null的对象来轻松修复 我注意到错误不会在VS2010中抛出,而只在VS2008中抛出 class Program { static void Main(string[] args) { var o1 = new MyObject?(new MyObject(2.34M)); o1 *= -1; } } publi

有人能解释为什么下面的代码会抛出错误吗。可以通过将-1值强制转换为十进制(-1M)、将运算符重载更改为接受int或不使用可为null的对象来轻松修复

我注意到错误不会在VS2010中抛出,而只在VS2008中抛出

class Program
{
    static void Main(string[] args)
    {
        var o1 = new MyObject?(new MyObject(2.34M));
        o1 *= -1;
    }
}

public struct MyObject
{
    public MyObject(Decimal myValue)
    {
        this.myValue = myValue;
    }

    private Decimal myValue;

    public static MyObject operator *(MyObject value1, decimal value2)
    {
        value1.myValue *= value2;
        return value1;
    }
}
在VS 2008和VS 2010中(在我的机器上)都运行良好。顺便说一句,您的
*
实现不正确。应该是:

public static MyObject operator *(MyObject value1, int value2)
{
    return new MyObject(value1.myValue * value2);
}

可能您的意思是
运算符*(MyObject value1,decimal value2)
,它确实失败了。

对于给定的代码片段,不需要重新编写。然而,您使用的代码与C#编译器中的旧错误非常相似。详细信息在中,Eric Lippert已经意识到了这一点。

下面的代码对操作数重新排序,并且不再抛出异常,相反,当程序退出时,myValue的值(正确地)是“无效的十进制值”

请注意,只有操作数的顺序发生了更改,我们将*=扩展为更明确的形式,并支持这一点

我没想到这些表面上的更改会阻止抛出异常。。但他们确实如此

是否认为这可能与以不同顺序推送到堆栈的值有关

// If you invert the order of the operands to MyObject.*() , and expand out the *= in main,
// the thing runs without throwing the exception :s

// If you step through, the value of myValue is correctly ‘invalid decimal value’ after * by -1.

using System;

namespace ConsoleApplication19
{
    class Program
    {
        static void Main(string[] args)
        {
            var o1 = (MyObject?)new MyObject(2.34M);
            o1 = -1 * o1 ;
        }
    }

    public struct MyObject
    {
        private Decimal myValue;

        public MyObject(Decimal myValue)
        {
            this.myValue = myValue;
        }

        public static MyObject operator *(Decimal value2,  MyObject value1)
        {
            value1.myValue *= value2;
            return value1;
        }
    }
}

是很抱歉,运算符重载本应排除小数点,但int除外不会导致任何问题。尽管该方法的实现是正确的,因为MyObject可以轻松地在其上拥有更多属性,并且通过返回新对象(如示例中所示),您将失去这些值。