类型为..的表达式..当类被密封时,不能由模式处理



我得到了一个相当奇怪的错误:

CS8121 An expression of type 'IGrouping<string, IMyInterface>' cannot be handled by a pattern of type 'MyClass1'.

错误发生在线路上:

if(tGroup is MyClass1 myclass1)

但是,对于未密封的MyClass2,没有提供任何错误。

  1. 是什么原因造成的
  2. 除了不密封MyClass1之外,还有什么解决方案

using System;
using System.Collections.Generic;
using System.Linq;
namespace Demo
{
class Program
{
static void Main()
{
IEnumerable<IMyInterface> myInterfaces = new List<IMyInterface>();
foreach (IGrouping<String, IMyInterface> tGroup in myInterfaces.GroupBy(x => x.XXX))
{
if(tGroup is MyClass1 myclass1)
{
}
if(tGroup is MyClass2 myClass2)
{
}
}
}
}
public interface IMyInterface 
{
String XXX { get; } 
}
public sealed class MyClass1 : IMyInterface
{
public String XXX { get; }
}
public class MyClass2 : IMyInterface
{
public String XXX { get; }
}
}

如果MyClass是密封的,那么就永远不会有继承MyClass并实现IGrouping<string, IMyInterface>的子类编译器足够聪明,可以推断出这一点,因此";抱怨";。

如果它没有密封,可能会有这样的东西:

class WhatEver : MyClass, IGrouping<string, IMyInterface> { ... }

因此,编译不能排除is是否会成功。

编辑我肚子饿了,你实际上想做的是这样的事情:

foreach (IGrouping<String, IMyInterface> tGroup in myInterfaces.GroupBy(x => x.XXX))
{
foreach(IMyInterface item in tGroup)
{
if(item is MyClass1 myclass1)
{
}
if(item is MyClass2 myClass2)
{
}
}
}

相关内容

  • 没有找到相关文章

最新更新