相关疑难解决方法(0)

为什么C#泛型不能像C++模板中那样从泛型类型参数中派生出来?

为什么C#泛型不能像C++模板中那样从泛型类型参数中派生出来?我的意思是我知道这是不可能的,因为CLR不支持这个,但为什么呢?

我知道C++模板和C#泛型之间的深刻差异 - 前者是编译时实体,必须在编译期间解析,而后者是一流的运行时实体.

不过,我没有看到的原因,为什么CLR的设计者并没有拿出一个方案,该方案将最终使CLR泛型类型从泛型类型参数的一个派生.毕竟,这将是非常有用的功能,我个人非常想念它.

编辑:

我想知道一个核心问题,解决这个问题会产生如此高的代价来实现这个功能,这个功能证明它还没有得到实施.例如,检查这个虚构的声明:

class C<T> : T
{
}
Run Code Online (Sandbox Code Playgroud)

正如Eric Lippert已经注意到" 如果T是一个结构怎么办?如果T是一个密封的类型怎么办?如果T是一个接口类型怎么办?如果T是C怎么办?如果T是从C语言中得到什么怎么办?"如果T是带抽象方法的抽象类型?如果T的可访问性低于C怎么办?如果T是System.ValueType怎么办?(你能否有一个继承自System.ValueType的非结构?)System.Delegate怎么样? System.Enum等等? "

正如埃里克继续说的那样," 那些是容易的,显而易见的 ".的确,他是对的.我感兴趣的是一个既不容易也不明显的问题的具体例子,这个问题很难解决.

.net c# generics clr

42
推荐指数
4
解决办法
2万
查看次数

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

我一直在尝试这个,但我似乎无法解决这个问题.我想做这个...

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());
}
Run Code Online (Sandbox Code Playgroud)

计划是像这样使用它,它可以在基类周围"包裹"单例模式......

public class SingletonFoo : SingletonType<SingletonFoo, Foo> {
}
Run Code Online (Sandbox Code Playgroud)

但是,我一直这样做

无法从'TBaseClass'派生,因为它是一个类型参数

嗯...我想类型为你到底是什么的派生!

那我错过了什么?

注意:这当然是一个简单的例子,因为它没有添加任何有用的东西,但是假设SingletonType有许多其他逻辑与问题无关,因此忽略了关注手头的问题.

c# generics inheritance subclass derived-class

24
推荐指数
2
解决办法
1万
查看次数

标签 统计

c# ×2

generics ×2

.net ×1

clr ×1

derived-class ×1

inheritance ×1

subclass ×1