考虑

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。

最佳答案

好吧,这是预期的。因为ResultResults不是同一类,所以它们仅实现一个公共(public)接口(interface),但不能相互转换,这就是为什么会出现错误。

这会引起歧义。如果您的类型实现了多个公共(public)接口(interface),比如IFoo,将会发生什么。然后编译器应该选择IResult还是IFoo?您可以说由于返回类型而应选择IResult,但是应该发生的情况不是返回语句,例如,这可能是简单的赋值。因此,简而言之,C#编译器不会对类型进行假设。
这也在C# Specification中的7.13 The null coalescing operator中声明

08-06 03:32