Я обновил свой проект до целевого С# 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, похоже, не знает об этой проблеме, так как рекомендует менять код для использования сопоставления шаблонов с помощью анализатора и позволяет мне применять "исправление кода", приводящее к повреждению кода.