c# - 为什么 C# 不接受带有泛型参数的构造函数要求?

标签 c# generics constructor

使用 C# 泛型,您可以拥有这样的类:

class Foo<T> where T:new() {}

这意味着类型 T 应该有一个没有参数的构造函数。如果我们可以拥有,那就太好了:

class Foo<T> where T : new(string)
{
    private T CreateItem()
    {
        string s="";
        return new T(s);
    }
}

Microsoft 没有将此功能添加到语言中有什么原因吗?

最佳答案

Is there any reason that Microsoft haven't added this feature to the language?

您描述的功能是更一般的功能“允许需要特定方法存在的约束”的特定情况。例如,您可能会说:

void M<T>(T t) where T has an accessible method with signature double Foo(int)
{
    double x = t.Foo(123);
}

我们在 C# 中没有该功能,因为必须通过成本效益分析来证明功能的合理性。从设计和实现的角度来看,这将是一项相当昂贵的功能——这一功能不仅会插入 C# 需求,还会插入所有 .NET 语言的需求。证明该功能合理的引人注目的好处是什么?

此外:假设我们确实设计了该功能。 如何有效实现?泛型类型系统中的约束经过精心设计,因此抖动可以一次生成高效代码,然后可以为每个引用类型共享这些代码。我们如何为任意方法模式匹配生成高效代码?当在编译时可以知道方法的槽时,这种高效的分派(dispatch)非常简单;有了这个功能,我们将不再拥有这种优势。

您想要的功能是相同的功能,只是具有仅限于构造函数的那种方法。

请记住,泛型的目的是让您编写通用类型 代码。如果您需要比 类型系统 中可以捕获的内容更具体的约束,那么您可能正在尝试滥用泛型。

关于c# - 为什么 C# 不接受带有泛型参数的构造函数要求?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/7067214/

相关文章:

c# - 在 C# 中使用 namespace 别名有什么好处?

java - 如何用不同类型的列表初始化一个对象?

c++ - 一些简单的构造函数代码的解释

python - 我应该将 MyClass.__init__ 构造函数传递给工厂方法吗?

c# - 由于 WebRequestHandler,Web 应用程序在部署到 azure 后崩溃

c# - StackExchange.Redis 在重负载时不读取响应

c# - CaSTLe Windsor 解析通用接口(interface)

C#:可以返回新添加对象的排序位置的通用排序容器?

JavaScript 匿名构造函数 : ! function(){}();

c# - 如何使用相对路径在c#中获取图像文件?