gpt4 book ai didi

c#-4.0 - 以接口(interface)为基类的三元表达式

转载 作者:行者123 更新时间:2023-12-02 08:00:59 25 4
gpt4 key购买 nike

我正在尝试创建三元表达式,但收到以下错误

“无法确定条件表达式的类型,因为 LiveSubscription 和 DisconnectedSubscription 之间没有隐式转换”

相同的逻辑适用于 if 语句,但我想了解为什么它不适用于三元表达式 -

这是我想做的事情的要点:

public interface IClientSubscription
{
bool TryDisconnect();
}

public class LiveSubscription : IClientSubscription
{
public bool TryDisconnect()
{
return true;
}
}

public class DisconnectedSubscription : IClientSubscription
{
public bool TryDisconnect()
{
return true;
}
}

public class ConnectionManager
{
public readonly IClientSubscription Subscription;

public ConnectionManager(bool IsLive)
{
// This throws the exception
Subscription = (IsLive)
? new LiveSubscription()
: new DisconnectedSubscription();

// This works
if (IsLive)
{
Subscription = new LiveSubscription();
}
else
{
Subscription = new DisconnectedSubscription();
}
}
}

我总是可以将其切换为 if/else,但我想先了解出了什么问题!

最佳答案

您需要将至少一个操作数转换为 IClientSubscription:

Subscription = (IsLive)
? (IClientSubscription)new LiveSubscription()
: new DisconnectedSubscription();

原因是三元表达式是由操作数决定的某种类型。基本上,它尝试将第二个操作数转换为第一个操作数的类型,反之亦然。两者都在这里失败,因为 LiveSubscription 不是 DisconnectedSubscription,反之亦然。
编译器不会检查两者是否共享公共(public)基类型。

<小时/>

尝试回答您在评论中的问题:

不,三元表达式不是某种对象,但三元表达式是赋值的右侧部分。赋值的每个右侧部分表达式都有特定的类型,否则无法将该表达式分配给左侧的变量。
示例:

  • var x = Guid.NewGuid()

    右侧表达式 (Guid.NewGuid()) 的类型为 Guid,因为方法 NewGuid() 返回 指南

  • var x = y.SomeMethod()

    右侧表达式的类型是 SomeMethod() 的返回类型。

  • var x = IsLive ? “a”:1

    这显然是无效的,不是吗? x 应该是什么类型? string 还是 int
    这将导致与您的代码完全相同的错误消息。

  • 你的例子有点改变:

    var subscription = (IsLive) ? new LiveSubscription()
    : new DisconnectedSubscription();

    请注意订阅之前的var,我们现在初始化一个新变量,而不是现有变量。我认为即使在这里,问题是什么也很明显:订阅应该是什么类型? LiveSubscription 还是 DisconnectedSubscription?两者都不能,因为根据 IsLive,它必须是其中之一。

关于与if的比较:

在您将新的 LiveSubscription 实例或新的 DisconnectedSubscription 实例分配给 Subscription 的代码中,隐式转换为 IClientSubscription 正在发生,因为编译器知道 Subscription 的类型为 IClientSubscription 并且 LiveSubscriptionDisconnectedSubscription 都可以隐式转换为该接口(interface)。
三元表达式的赋值有点不同,因为编译器首先尝试计算三元表达式,然后才尝试将其分配给 Subscription。这意味着编译器不知道三元表达式的结果必须是 IClientSubscription 类型。

关于c#-4.0 - 以接口(interface)为基类的三元表达式,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/9810471/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com