为何运算符‘??’无法应用于A类与B类的实例?
为什么运算符‘??’无法应用于类型为‘A’和‘B’的操作数?
这是因为C#的**空合并运算符??**对操作数的类型有严格要求:两个操作数必须能隐式转换到同一个共同类型T——要么其中一个类型能隐式转成另一个的类型,要么两者都能隐式转成某个共享的父类型,且编译器能自动推断出这个T。
结合你的代码场景分析:
- 当操作数是同类实例时(比如
myA ?? myA),编译器直接把T推断为类A的类型,两个操作数自然都符合要求,所以编译正常; - 但
A和B是完全独立的类,互相之间没有继承或隐式转换关系,编译器找不到一个能让两者都隐式转换过去的共同类型T。虽然它们都继承自object,但编译器不会自动把T推断为object(这是类型推断的规则限制,避免意外的类型提升),因此触发编译错误。
解决方法
只要让编译器能明确推断出共同类型即可,比如显式将其中一个操作数转换为object:
A myA = new A(); B myB = new B(); // 显式转换其中一个操作数到object,编译器就能推断出T为object object? Fixed = myA ?? (object)myB;
或者先把其中一个实例赋值给object类型的变量,再进行运算:
object? aAsObj = myA; object? Fixed = aAsObj ?? myB;
内容的提问来源于stack exchange,提问作者user21777873
相关产品推荐
相关产品推荐

