具有基类和泛型类型的C#模式匹配

具有基类和泛型类型的C#模式匹配,c#,pattern-matching,C#,Pattern Matching,我有一段代码,它检查一个对象是否属于序列类型,它与任务类型的对象一样工作 public class Sequence<T> {} public class Task : Sequence<Task> {} public class Program { public static void Main() { var task = new Task(); // These two are e

我有一段代码,它检查一个对象是否属于
序列类型
,它与
任务类型
的对象一样工作

public class Sequence<T> {}

public class Task : Sequence<Task> {}

public class Program
{
    public static void Main()
    {
        var task = new Task();
                
        // These two are equivalent
        Console.WriteLine(IsSequence(task));
        Console.WriteLine(task is Sequence<Task>); 
    }
    
    public static bool IsSequence<TEntity>(TEntity entity)
    {
        return entity is Sequence<TEntity>;
    }
}

我知道它当前的编写方式不匹配,因为
工具
/
程序集
不是
序列
/
序列与此示例相同。

您编写函数的方式不起作用,因为
工具
不是
序列,而是
序列

如果您选择保留函数,有很多很多方法可以编写函数,不管出于什么原因,但我给您两种方法

首先,您可以编写它来接收
对象
参数,然后在内部使用
is Sequence
来确定它是否是某个序列。问题是每次都需要提供类型参数,这里没有推论

第二,你可以这样写:

    public static bool IsSequence<TEntity>(Sequence<TEntity> entity) => true;
    public static bool IsSequence(object obj) => false;
公共静态bool IsSequence(序列实体)=>true;
公共静态bool IsSequence(objectobj)=>false;
在这种情况下,不需要提供类型参数,只需使用对象调用它,它将返回正确的值。由于它依赖于编译时重载解析,所以在运行时非常有效。另外,它应该看起来熟悉任何C++程序员!
作为第三个选项,从
序列
类中提取一个接口
IseSequence
,然后简单地使用没有类型参数的
IseSequence
进行测试,因为您在测试中似乎并不关心它。

您编写函数的方式不起作用,因为
工具
不是
序列
,这是一个
序列

如果您选择保留函数,有很多很多方法可以编写函数,不管出于什么原因,但我给您两种方法

首先,您可以编写它来接收
对象
参数,然后在内部使用
is Sequence
来确定它是否是某个序列。问题是每次都需要提供类型参数,这里没有推论

第二,你可以这样写:

    public static bool IsSequence<TEntity>(Sequence<TEntity> entity) => true;
    public static bool IsSequence(object obj) => false;
公共静态bool IsSequence(序列实体)=>true;
公共静态bool IsSequence(objectobj)=>false;
在这种情况下,不需要提供类型参数,只需使用对象调用它,它将返回正确的值。由于它依赖于编译时重载解析,所以在运行时非常有效。另外,它应该看起来熟悉任何C++程序员!
作为第三个选项,从
Sequence
类中提取一个接口
ISequence
,然后简单地使用没有类型参数的
ISequence
进行测试,因为您在测试中似乎并不关心它。

感谢您的详细解释:)我知道这就是它不起作用的原因,但是,我们需要找到一种方法来重写
is
,以便它最终能够做到。你能举一个“第一”选项的例子吗?第二个选项在我的场景中不是一个可行的解决方案不幸的是(编辑了我的答案以澄清这一点)我认为第三个选项可能是唯一可行的,但我试图看看我是否可以不使用标记接口而逃脱。
public static bool IsSequence(object obj)=>obj是Sequence
,您可以像
IsSequence(新工具())
一样调用它。你正在深入到一个XY问题中,尽管这些错误“不是可行的解决方案”和“不喜欢”,但这绝对不是使用C#的方式。你完全正确,对此表示抱歉。我想我可能误解了你的第二种选择,让我检查一下。我没有设法适应它,但将采用第三种方法。再次感谢。感谢您的详细解释:)我知道这就是它不起作用的原因,但需要找到一种方法来重写
is
,以便它最终起作用。你能举一个“第一”选项的例子吗?第二个选项在我的场景中不是一个可行的解决方案不幸的是(编辑了我的答案以澄清这一点)我认为第三个选项可能是唯一可行的,但我试图看看我是否可以不使用标记接口而逃脱。
public static bool IsSequence(object obj)=>obj是Sequence
,您可以像
IsSequence(新工具())
一样调用它。你正在深入到一个XY问题中,尽管这些错误“不是可行的解决方案”和“不喜欢”,但这绝对不是使用C#的方式。你完全正确,对此表示抱歉。我想我可能误解了你的第二种选择,让我检查一下。我没有设法适应它,但将采用第三种方法。再次感谢。