c# - 为什么 new() 约束必须需要公共(public)构造函数?

标签 c# generics .net-4.0 singleton

免责声明:理论问题

The new constraint specifies that any type argument in a generic class declaration must have a public parameterless constructor.

Source: http://msdn.microsoft.com/en-us/library/sd2w2ew5(v=vs.80).aspx

如果我希望我的泛型类有一个protected 无参数构造函数怎么办?例如,如果我想写一个 Singleton我“附加”到其他类(class)以制作它们的类(class)Singleton s,我不希望派生类是可实例化的 - 一切都应该通过 .Instance属性(property)。

internal class Singleton<T> where T : new()
{
    public static T Instance { get; private set; }

    static Singleton()
    {
        Singleton<T>.Instance = new T();
    }
}

internal class OnlyOneOfMe : Singleton<OnlyOneOfMe>
{
    protected OnlyOneOfMe()
    {
    }
}

这边,Singleton<T>能够创建 OnlyOneOfMe 的唯一实例类,但没有别的可以(除非它是一个子类)。

“如果泛型父类可以访问泛型类型的 protected 成员会怎样?”

最佳答案

因为那是约束的定义。这有点像问为什么 T : class 要求 T 是引用类型。根据定义,这是真的。

此外,如果它不是公共(public)构造函数,那么约束的意义何在?接收类型参数 T 的类如果不是 public 将无法调用构造函数。

关于c# - 为什么 new() 约束必须需要公共(public)构造函数?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/5984152/

相关文章:

c# - WMI - 直接访问 Win32_OperatingSystem 的单例实例

c# - c#中的嵌套锁定误解?

java - 如何将 Java 反射与通用参数一起使用

C++,要返回各种类实例如何创建模板?

ios - 无法转换 NSURL 类型的值? _ 类型的预期参数?

c# - 剩余时间基于进度?

visual-studio-2010 - VSTS 2010 SGEN : error : Could not load file or assembly (Exception from HRESULT: 0x80131515)

C#(Xamarin iOS) 如何从 UITableView 导航到其他 ViewController?

c# - 无法将 cls 文件导入到 sql server 2005

c# - 使用 linq 组合两个对象的更好方法?