繁体   English   中英

在 C# 4.0 中,是否可以从泛型类型参数派生 class?

[英]In C# 4.0, is it possible to derive a class from a generic type parameter?

我一直在尝试这个,但我似乎无法弄清楚这一点。 我想做这个...

public abstract class SingletonType<TSingleton, TBaseClass> : TBaseClass
    where TSingleton : TBaseClass, new()
    where TBaseClass : class
{
    static TSingleton _singleton;
    public static TSingleton Singleton
        => _singleton ?? (_singleton = new TSingleton());
}

计划是像这样使用它,它将 singleton 模式“包裹”在基础 class 周围......

public class SingletonFoo : SingletonType<SingletonFoo, Foo> {
}

但是,我不断收到这个

无法从“TBaseClass”派生,因为它是类型参数

嗯...我认为类型正是从中派生的!

那么我错过了什么?

注意:这当然是一个微不足道的例子,因为它没有添加任何有用的东西,但假设SingletonType有很多与问题无关的其他逻辑,因此省略了关注手头的问题。

C# 中的泛型类型不是 C++ 模板; 请记住,泛型类型必须适用于所有可能的类型 arguments。 模板只需要适用于您实际制作的结构。

这个问题是重复的; 看我的回答

为什么 C# generics 不能像在 C++ 模板中那样从泛型类型参数之一派生?

有关此的更多想法。 基本上,简短的回答是,可观的成本并没有超过该功能的小好处。 如果您不喜欢该答案,请参阅我的第二个答案:

为什么 C# generics 不能像在 C++ 模板中那样从泛型类型参数之一派生?

如果您也不喜欢这个答案,请参阅后续问题:

希望 .NET generics 可以继承其中一种通用参数类型的充分理由是什么?

不,这是不可能的。 例如,采用声明为sealed的类型。 您不能从该 class 继承,并且没有限制非密封类型的限制,因此尝试通过泛型参数从它继承是不可能的。

即使涉及 generics,每种类型都恰好有 1 个真实的离散父 class。 即使在处理开放的泛型类型(例如typeof(List<>) )时,您仍然可以找到父 class。

如果你想要的东西被允许,这不会是真的, typeof(SingletonType<,>不会有父类型,这是不允许的。

不,这是不可能的,因为假设你有这个 class:

class bar {
  int example = 0;
}

现在这是我们的类型参数 class:

class foo<T> : T {
  int example = 5;
}

如果我们创建了一个foo<bar>类型的变量,那么example就会混淆。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM