我已将我的项目升级为目标C# 7,并使用Visual Studio 2017 RC实现了整个解决方案中的模式匹配。在这样做后,一些与泛型参数相关的模式匹配错误被引入。
请考虑以下代码:
请考虑以下代码:
public class Packet
{
}
public class KeepalivePacket : Packet
{
}
public void Send<T>(T packet)
where T : Packet
{
if (packet is KeepalivePacket keepalive)
{
// Do stuff with keepalive
}
switch (packet)
{
case KeepalivePacket keepalivePacket:
// Do stuff with keepalivePacket
break;
}
}
if
语句和case
语句都会产生编译错误。
类型为T的表达式无法被类型为KeepalivePacket的模式处理。
如果我首先将参数强制转换为object
类型,则模式匹配按预期工作。 Roslyn随后将object
的强制转换标记为冗余。
if ((object)packet is KeepalivePacket keepalive)
{
// This works
}
这个错误似乎只适用于泛型参数和变量。Roslyn似乎没有意识到这个问题,因为它建议通过分析器更改代码以使用模式匹配,并允许我应用“代码修复”,导致代码出错。
is
运算符已经成为了坏味道... - Willem Van Onsemis
运算符等最好都由动态绑定替换,因为这些更具类型安全性。 - Willem Van Onsemis
/as
运算符替换为动态绑定的例子呢?或者你是在指动态分派吗?针对上面的代码,数据包是由序列化器返回的,并且通过根据类型进行开关来实现控制流程。 - Alex Wiese