如何重载空条件运算符“?”。

时间:2019-06-29 18:45:26

标签: c#

有一个简单的类:

namespace ConsoleApp5
{
    class Program
    {
        static void Main(string[] args)
        {
            Test test = null;
            int? t;
            t = test?.i;  // in this place the overloaded method "operator! =" is NOT called
            if (test != null) // in this place the overloaded method "operator! =" is called
            {
                t = test.i;
            }
        }
    }
    public class Test
    {
        public int i = 5;
        public override bool Equals(object obj)
        {
            return true;
        }
        public static bool operator ==(Test test1, Test test2)
        {
            return true;
        }
        public static bool operator !=(Test test1, Test test2)
        {
            return true;
        }
    }
}

在这一行:

if (test != null)

称为

public static bool operator !=(Test test1, Test test2)

但在这一行:

t = test?.i;

没有一个重载方法被调用

如何重载运算符“?”。

1 个答案:

答案 0 :(得分:5)

否,您不能重载Null-conditional operators。请参阅C#Overloadable operators的列表。


附录实际上已经向C#语言团队提出了重载此运算符的功能。请参见Proposal: Allow null conditional (?.) and null coalescing ()?? operators to be overloadedProposal: nullable-like types。这些尚未得到批准。

接下来是我对这些建议和类似建议的关注:

更改这些运算符的语义可能会有很多影响。例如,假设运算符是静态的,则可以说null不是。这对于很多代码来说意味着很多问题。另一方面,您可能会将代码挂在参考上的时间太长或不够长,这会导致垃圾回收问题。

即使可以解决这些问题和类似问题,也不要轻易改变。我们正在谈论现有代码的许多问题,这些问题已经在生产环境中部署。