问题标签 [generic-constraints]

For questions regarding programming in ECMAScript (JavaScript/JS) and its various dialects/implementations (excluding ActionScript). Note JavaScript is NOT the same as Java! Please include all relevant tags on your question; e.g., [node.js], [jquery], [json], [reactjs], [angular], [ember.js], [vue.js], [typescript], [svelte], etc.

0 投票
1 回答
67 浏览

c# - C# 方法使用“新”的多个约束

我正在尝试定义一个具有多个约束的方法,其中该T类型可以用作构造函数:

new虽然说我收到了一个错误

) 预期的

什么是正确的语法?

0 投票
0 回答
57 浏览

c# - 为什么有自泛型类型约束?

我正在审查一些前雇员编写的一些代码,发现了这个

继承的类是这样定义的

我的问题是为什么基类指定一个从自身继承的泛型类型 T ?如果我删除这个通用约束,那么什么都不会改变,所以我想知道为什么它首先存在?像这样指定我不知道的通用约束有什么好处吗?

0 投票
1 回答
66 浏览

swift - Swift - 继承协议和将 Self 约束到协议之间的区别

我有一个协议A

像这样实现协议有什么区别B

而不是像这样实现它:

?

我可以用一个做什么而我不能用另一个做什么?我会在哪里遇到可以通过将其切换到另一个来解决的问题?

0 投票
1 回答
4907 浏览

c# - 我可以将 C# 7.3 与 .Net Framework 4.6.1 一起使用吗?

我对enum通用约束感兴趣,但是当我在Build → Advanced上切换项目的语言版本时,我仍然收到错误 «在 C#5 中不可用;请使用 7.3 或更高版本的语言» 即使在重新打开项目后也是如此。
项目类型是 ASP.NET MVC 应用程序。

0 投票
4 回答
217 浏览

c# - 如何使用没有约束的类型参数调用具有泛型约束的方法?

假设我有一个方法:

我想按如下方式使用它:

因此,在运行时我知道S满足ExampleMethod<T>. 我知道可以使用反射来调用它,类似于:

没有反射可以吗?

注意:这是来自真实示例的简化代码,显然我无法控制这些方法的签名,因此答案“将约束添加到CallerMethod”和“从约束中删除ExampleMethod”是无效的。

Yes, the whole thing should be redesigned so the whole problem wouldn't appear at all. But as often in real-life "the whole thing" is too big, too coupled and too risky to rewrite. Some requirements have changed in an unexpected way - hence the apparent code smell, which I'm trying to minimize by hiding it in a single nasty-looking place.

0 投票
2 回答
559 浏览

c# - 通过特定的 where 子句在 C# 中创建泛型方法

我想创建一些通用方法,如下面的代码:

显然我想支持可枚举的集合以及从IBaseModel接口驱动的单个对象。方法定义是好的,但是当涉及到它的使用时,我会得到以下错误:

0 投票
0 回答
201 浏览

angular - 打字稿 - 通用约束 - 不接受匹配类型的对象文字

在 angular 7 框架中使用 typescript 3。

我正在尝试为 firebase 准备我的本地 Store 数组元素,使用对象的 Id 属性作为包装对象中的关键,反之亦然。

我已经设置了一个可以与我的任何本地 Store 元素一起使用的接口,因为它们都有一个 id 属性:

和 firebase 等价物,因为它们都使用 id 作为键

我正在尝试迭代 firebase 项目,并将其再次转换为数组,但出现类型错误:

我已经阅读了打字稿文档,除非我遗漏了一些东西,否则我不明白为什么我创建的对象文字不能分配给类型 T。我知道我可以在我的对象文字上进行类型化,这可以解决它,但是我不明白我为什么需要它。打字稿具有查找类型匹配的所有信息。

在这种情况下无法识别的原因是什么?

0 投票
1 回答
76 浏览

c# - IComparable<> 作为通用约束有什么特别之处

假设我有一堂课

现在在为 Apple 创建一个对象时,我会这样做

上面的代码将起作用。

如果我用任何其他通用接口替换相同的代码,比如IComparer<>IEnumerable<>等等。像上面这样的对象创建将不起作用,我们必须像这样声明它

为什么会这样?为什么我声明的IComparable<>方式只适用于它而不适用于任何其他接口?

0 投票
1 回答
179 浏览

c# - 为什么泛型约束不能帮助编译器在具有可选参数的多态方法中做出决定?

给定 2 个静态重载方法,一个是通用的,一个不是:

测试代码:

生成编译错误,因为它更喜欢泛型:

错误 CS0453:类型“字符串”必须是不可为空的值类型,才能将其用作泛型类型或方法“ExtensionMethods.NullIf(T, T)”中的参数“T”

如果可选的 ignoreCase 参数由调用者提供或从方法中删除,或者如果受约束的泛型方法被删除,它会编译。

为什么编译器不使用 where 约束来消除泛型,因为它认识到不兼容?

0 投票
0 回答
32 浏览

swift - 数组中的有序条件类型安全?

有没有办法在数组中实现有序的条件类型安全?

例如,如果我想要一种类似 DSL 的方式来创建汉堡,我可能想说:

如果添加 bun 类型,则无法将其再次添加到该数组中。如果您添加牛肉馅饼,您将无法再次添加,以此类推。

一种天真的方法是创建一个Struct

但是,您不能为 Burger 结构扩展和添加额外的属性(蛋黄酱、辣芥末等)。Typed Tagless 解决方案解决了这个问题,但不幸的是没有给出有序的一致性。

如果您需要一个不可扩展的解决方案,该Struct解决方案就可以工作,但是由于我正在创建一个可扩展的 API,其他贡献者可以添加额外的功能,因此 struct 解决方案很遗憾不能解决这些要求!

我探索过的途径是 Phantom Types 和 Typed Tagless 解决方案。

键入无标记

现在您应该能够以类似 DSL 的方式创建 Burger:

因此,Typed Tagless 解决方案满足了一些要求,但是如果您想要有条件的排序,Typed Tagless 解决方案是不可能的。

使用 Typed Tagless,您可以定义无限数量的属性:

外部 API 用户没有安全性。

有没有办法实现以下格式的有序类型一致性?