可以简化C#中的嵌套泛型吗?

可以简化C#中的嵌套泛型吗?,c#,generics,C#,Generics,我喜欢C#中的泛型,但有时使用它们会有点复杂。下面的问题我时不时遇到。有没有办法让这个场景更简单?我不知道怎么做,但我希望有人能:) 给定三个基类: public abstract class Inner { } public abstract class Outer<T> where T : Inner { } public abstract class Handler<TOuter, TInner> where TOuter : Outer<

我喜欢C#中的泛型,但有时使用它们会有点复杂。下面的问题我时不时遇到。有没有办法让这个场景更简单?我不知道怎么做,但我希望有人能:)

给定三个基类:

public abstract class Inner
{
}

public abstract class Outer<T>
    where T : Inner
{
}

public abstract class Handler<TOuter, TInner>
    where TOuter : Outer<TInner>
    where TInner : Inner
{
    public abstract void SetValue(TInner value);
}
公共抽象类内部
{
}
公共抽象类外部
其中T:内部
{
}
公共抽象类处理程序
兜售者:外
镀锡机:内部
{
公共抽象无效设置值(TInner值);
}
以及一些简单的实现:

public class In : Inner
{
}

public class Out : Outer<In>
{
}

public class HandleOut : Handler<Out, In>
{
    public override void SetValue(In value) { }
}
中的公共类:内部
{
}
公开课:外
{
}
公共类HandleOut:处理程序
{
public override void SetValue(值中){}
}
现在我的问题是:对于
HandleOut
TInner
的类型由类型“Out”给出,那么有没有办法将
HandleOut
的定义简化为类似于
公共类HandleOut:HandleOut
的东西,并且仍然能够使用内部类型作为
SetValue
的参数

这是一个非常简单的示例,但有时我会在定义中得到一长串泛型类型,而通常所有泛型类型都可以从第一个类型逻辑推断出来。我有没有错过什么把戏?

没有

虽然这种推断可能是可能的,但它不是语言的一部分。您可能有兴趣向(打开一个新的问题)建议这一点。当然,这种类型的泛型约束推理在复杂情况下可能会遇到问题,但至少在简单情况下是可行的。。。不过,这是C#团队应该投入时间和精力的地方吗

这是一个很好的链接


无论如何,在您呈现的代码中,
Out
确实已经为您提供了类型
in
,但不需要通用参数
TOuter

以下代码同样适用:

public abstract class Inner
{
}

public abstract class Outer<T>
    where T : Inner
{
}

public abstract class Handler<TInner> // NOTE: TOuter removed
    where TInner : Inner
{
    public abstract void SetValue(TInner value);
}

public class In : Inner
{
}

public class Out : Outer<In>
{
}

public class HandleOut : Handler<In> // NOTE: Out removed
{
    public override void SetValue(In value) { }
}
公共抽象类内部
{
}
公共抽象类外部
其中T:内部
{
}
公共抽象类处理程序//注意:TOuter已删除
镀锡机:内部
{
公共抽象无效设置值(TInner值);
}
公共类:内部
{
}
公开课:外
{
}
公共类HandleOut:Handler//NOTE:Out已删除
{
public override void SetValue(值中){}
}

这样,如果需要的话,可以考虑使用<代码>外部< /代码>代替TOuter。当然,如果您保存了一个

TOuter
列表,那么限制性就更小了,因为它将允许任何派生类型的
Outer
而不是任何派生类型的
TOuter


由于您没有在泛型约束中添加“new”,因此您没有创建这种类型的对象,但是如果案例出现,您可以在构造函数中接受一个
Func

我修复了您的代码,以便它能够编译。你能从你的问题的角度来检查一下它是否正确吗?虽然我认为你所问的不是100%一致,但你可能想读一篇Eric Lippert的博客文章,标题是(事实上,它们没有被继承是Enigmativity必须修复代码以添加更多约束的原因),谢谢,@Enigmativity。我只是在运行中编写了代码-您的更改完全符合我的想法:)谢谢您的回复。你是对的,在我的例子中,我可能会失去吹牛者,但这只是因为没有给出一个真实的例子——在我的真实生活中,我需要吹牛者。至于这是否是C#需要花时间做的事情,我不确定。它可能只是我的编码风格,经常让我陷入这种问题,但我会发现它非常方便,是一个非常好的抽象。可能类似于:public abstract class Handler where…?@ChrisRidge,语法可能有效,但与系统当前的操作方式几乎不一样,因为无论泛型参数是否隐式,都将丢失。这就是为什么我把它看作是对派生类型的推断。您有多少通用参数?[我想不出一个超过4年的案例]也许这是你正在开发的东西的一种特惠,或者也许你错过了一些抽象。。。然而,如果某个特定的案例得到缓解,roslyn团队可能会对此感兴趣。考虑可选——它不是真正需要的,但它简化了互操作和代码维护。在我当前的项目中,我自己没有超过四个,但是这些接口在很多时候被实现。必须为每个实现指定所有四种类型是乏味的,并且使代码更难理解。这绝对不是必备功能,但对我们来说,拥有该功能将是一件很棒的事情:)