gpt4 book ai didi

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

转载 作者:行者123 更新时间:2023-11-30 18:52:58 26 4
gpt4 key购买 nike

使用 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/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com