“对象到 int”运算符导致 C# 中的 NullReferenceException

" Object to int" operator causes NullReferenceException in c#

我在将对象转换为整数时遇到问题。每次我 运行 我的代码时,我都会得到 NullReferenceException。有什么办法可以省略吗?问题是关于 "public static implicit operator int".

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;

namespace ConsoleApplication1
{
    class Item
    {
        int number;

        public Item(int number1)
        {
            number = number1;
        }

        public static implicit operator int (Item item)
        // convert item to int
        {

            return item.number;
        }
        public static implicit operator Item(int number)
        // convert int to item
        {
            return new Item(number);
        }
    }
}

我们需要查看将此对象转换为整数的代码,但如果您的调用代码如下所示,则可能会发生这种情况:

Item item = null;
int i = item;

编译器会将其转换为大致等同于此的内容(前提是这在语法上是有效的):

Item item = null;
int i = Item.operator_int( item );

由于 item 为空,这就是传递给您的运算符的内容,当您尝试从 item (为空)获取 number 字段时,它会抛出空引用异常。您需要检查运算符中的 item 是否为 null。

隐式转换为 intItemnull,例如:

Item item = null;
int a = item; //Will call the implicit operator with null
Console.WriteLine(a);

中间行将调用带有 null 的隐式运算符,这将导致它查找 item.number,其中 item 为 null,并会抛出一个 NullReferenceException,就好像您将编写以下内容:

Item item = null;
int a = Item.operator_int(item);
Console.WriteLine(a);

您应该更改您的运算符以设置默认值,例如:

public static implicit operator int (Item item)
{
    if (item == null)
    {
        return default(int); //0
    }
    return item.number;
}