考虑
interface IResult {}
class Result : IResult {}
class Results : IResult {}
class Producer {
private Results results;
IResult DoSomething() {
return results ?? new Result();
}
}
这会因编译器错误而失败
Operator '??' cannot be applied to operands of type `Result` and `Results`
对我来说,这是意外的行为。考虑一下,.NET框架可能会创建一个
Results
类型的中间变量(左操作数)。正确的操作数Result
具有不同的类型,因此会产生类型转换错误。这个假设正确吗?如果是,为什么csc无法检测到中间变量的类型为
IResult
?所以我将代码更改为
return results == null ? new Result() : results;
但是此代码错误
There is no explicit conversion between `Result` and `Results`
为什么?我不希望这样,因为两个实例都符合IResult。
最佳答案
好吧,这是预期的。因为Result
和Results
不是同一类,所以它们仅实现一个公共(public)接口(interface),但不能相互转换,这就是为什么会出现错误。
这会引起歧义。如果您的类型实现了多个公共(public)接口(interface),比如IFoo
,将会发生什么。然后编译器应该选择IResult
还是IFoo
?您可以说由于返回类型而应选择IResult
,但是应该发生的情况不是返回语句,例如,这可能是简单的赋值。因此,简而言之,C#
编译器不会对类型进行假设。
这也在C# Specification
中的7.13 The null coalescing operator
中声明