为什么在C#中的泛型参数上没有带参数的构造函数约束?

5

众所周知,在当前版本的C#中,我们无法编写以下这样的代码:

public class A {
    public static void Method<T> () where T : new(string, string) {
        var x = new T("foo", "bar");
    }
}

但我们可以使用new()约束来强制要求T具有公共的无参构造函数,然后我们就能够使用new T()表达式创建T的新实例。

在SO上有很多关于各种解决方法的答案,但它们中没有一个解释为什么语言设计者没有实现这样的特性。从SO上的问题数量来看,它似乎在现实世界的应用中会很有用。

为什么C#没有实现这个功能,有没有可能在下一个版本的语言中加入它?


这有点违背泛型的初衷,因为现在你的泛型代码必须对类型了解得太多。出于同样的原因,你不能在接口中定义构造函数,构造函数是实现细节。 - CodeCaster
4
我被问到“为什么C#不实现X功能?”这样的问题非常频繁。答案总是相同的:因为没有人设计、指定、实现、测试、记录和发布该功能。 - user4003407
这是一个关于Github提案的链接:https://github.com/dotnet/roslyn/issues/2206。看起来是CLR的限制。 - Jesse Good
1
核心问题在于,在编译泛型类时无法确定需要调用哪个特定的构造方法。像这样的代码只能在基于模板的方法中高效执行,而不是.NET泛型实现的方式。唯一的其他选择是在运行时使用反射,这与.NET泛型的初衷大相径庭。如果您想编写慢速代码,那么必须明确表达,以便任何人都能看出来,调用Activator.CreateInstance()由您决定。 - Hans Passant
1
是的,它在CLR中进行了微优化。请注意它不能接受参数。 - Hans Passant
显示剩余5条评论
1个回答

5
根据在github上的功能请求链接,原因是CLR没有提供C#实现所需的信息。
有猜测称,CLR可能会被修改以支持未来的C#版本(7.0?)来支持此功能。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接