为什么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等等? "
正如埃里克继续说的那样," 那些是容易的,显而易见的 ".的确,他是对的.我感兴趣的是一个既不容易也不明显的问题的具体例子,这个问题很难解决.
我一直在尝试这个,但我似乎无法解决这个问题.我想做这个...
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有许多其他逻辑与问题无关,因此忽略了关注手头的问题.