问题标签 [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 投票
4 回答
1210 浏览

delphi - Delphi XE:我可以从类类型约束的泛型类型中调用带有参数的虚拟构造函数而不接受黑客攻击吗?

我正在尝试为复合控件构建一个通用祖先。最初的想法是这样的:

您可能已经知道,这将触发编译器错误 E2568: Can't create new instance without CONSTRUCTOR constraint in type parameter declaration。然而,添加constructor约束并没有帮助,因为它意味着一个无参数的构造函数。

转换模板以TControl使代码可编译:

...但它会在运行时导致访问冲突。

一种可能有效的技巧是通过 RTTI 调用构造函数,但我认为这是一个相当肮脏的解决方案。

另一个基本有效的技巧是使用类类型变量作为中间体:

有更清洁的解决方案吗?另外,有人可以向我解释为什么 classtype-constraint 不足以直接在类型参数上调用虚拟构造函数吗?

0 投票
1 回答
2007 浏览

c# - C# 泛型和泛型约束

我正在编写一个带有类型参数 T 的通用抽象类 A,我打算用类 B 派生它。

A 有一个数据成员 mX,它是类 C 的一个实例,带有一个通用函数。这个通用函数 GetAllOfType() 有一个类型参数 T。这个类型参数被限制到第三个类 D。GetAllOfType() 搜索 D 实例的容器,其中包括 D 的派生类的实例,并返回T 类型的子集(因此对 D 的约束)。

D 类本身没有特定的数据成员 int mY,但 D 的某些派生类有,例如 E 和 F。

所以这是我的问题开始的地方:

B 类用于继承和实现 A 类的参数类型是 D 的派生类。我正在尝试在 A 类中编写一个函数 Foo,该函数通过 GetAllOfType() 枚举并访问 E、F 或任何其他类型的成员 mY有一个 myY 的成员。

但是,问题是 GetAllOfType() 受到约束,并且我也因未约束 A 类而收到错误消息。

我试过像这样约束 A :

但是我遇到了编译时错误:

键入T' does not contain a definition formY' 并且找不到扩展方法mY' of typeT'(您是否缺少 using 指令或程序集引用?)

我还尝试限制到多个派生类:

但是我也遇到了以下错误:

类类型约束“F”必须列在任何其他约束之前。考虑将类型约束移动到约束列表的开头

我试过切换它们:

同样,结果是相同的错误,但将 F 切换为 E。

我正在尝试的可能吗?我究竟做错了什么?

同样,我无法更改 C、D、E 和 F 类的任何内容。

0 投票
2 回答
394 浏览

c# - 类签名中的通用约束推断

在使用 C# 泛型约束时,我对某些要求感到沮丧,我想知道是否有办法解决我的问题。如果没有,我想解释一下为什么事情没有按照我想要的方式工作。

这个例子展示了我目前基本上要做的事情:

提案 A显示了我希望得到的东西(我看不出它不能以这种方式工作的原因):

提案 B展示了另一种可能的选择,尽管不如提案 A 有吸引力:

这两个提案都将最小化我在创建派生类型时必须指定的类型参数的数量,并且提案 A 将消除对一堆冗余约束的需要。

那么 C# 不能/不应该为这些提案之一提供支持是否有原因?(或者我是否忽略了该语言的相关现有功能?)

0 投票
1 回答
123 浏览

c# - C# - 通过继承改变“where”限制

假设我有一个通用数据访问层,它应该支持不同的实现。为了实现这一点,我有一个基本接口IPeristenceService,它定义了访问持久层内数据的所有方法。界面可能如下所示:

所以持久化服务不能创建仅由它们的接口定义的对象的实例,所以限制 - 方法的实现是一个不错的决定GetData

这非常简单,因为实现此接口的开发人员在尝试返回接口指针时将无法编译他们的代码。持久层内部的数据需要用实现的对象来表示,而不是接口!

现在假设我们正在创建一个持久化服务,它将数据持久化到一个关系数据库中,由实体表示。所有实体都继承自一个基本接口:IEntity. 传递非实体对象一定会失败,因为持久化服务只能持久化实体。所以我们需要验证传递的对象实例是否继承自IEntity. 在编译时使用 where-notation 是可能的,但只需实现这样的接口:

不工作,是吗?!

有什么办法可以实现我想要做什么?

先感谢您 :-)

0 投票
3 回答
1300 浏览

c# - C# 无界泛型类型作为约束

是否可以有一个无界泛型类型的泛型约束?

例如:


编辑:只是为了解释上下文,我想将方法​​的使用限制为 IDictionary,但对于方法本身,TKey 和 TValue 到底是什么并不重要。

0 投票
1 回答
136 浏览

c# - 如何为类型参数添加 2 个 new() 约束?

我想要这样的东西:

而且我想强制 TFrom 和 TTo 都是从基本类型派生的。

我想把这个方法作为TFrom 类型的扩展方法

可能吗 ?什么是正确的语法?

0 投票
2 回答
77 浏览

c# - 为什么我不能返回泛型类型约束中指定的类型,但可以在没有约束的情况下返回相同的类型?

我有这个:

但这些东西有效:

  1. 为什么即使返回类型仍然存在,第二个代码块也不会编译IClub?这不是不公平吗?

  2. 我知道我没有充分利用上述代码中类型约束的潜力,但是让代码运行的替代方法是什么?

0 投票
1 回答
72 浏览

c# - 类型推断是在类的范围内推断,但不是方法,尽管它们是一样的?

好吧,我一定是把标题弄错了。更多的代码,更少的文字:

编译器很高兴Do. 它可以很容易地推断出T类型。现在让我们说我有这个:

编译器希望现在显式键入类型。这是我的想法:

在第一个类T中,很容易从IsVisible具有T重载并且T在整个Manager类中都知道的方法中推断出来,没什么大不了的。但在第二种情况下T,它被指定为方法的通用约束,可能更难推断。行。

但这也不起作用:

  1. 为什么编译器T在最后一种情况下不推断?

  2. 更重要的是,最后一个案例与第一个案例有何不同?在第一种情况下,编译器必须从IsVisible方法中推断出它,然后一直返回以检查T包含 的类中的内容,而在最后一种情况下,它在方法IsVisible中很容易获得。IsVisible所以我认为第三种情况比第一种更容易。

0 投票
2 回答
127 浏览

c# - 简单类型和字符串的 where 约束

我有一个通用方法,我想对其施加约束。

约束是所有简单类型 int、bool 等,但我还需要允许字符串。我有办法限制这个群体吗?

0 投票
1 回答
2487 浏览

c# - 为什么可以为空不匹配作为泛型约束的引用类型

可能重复:
可空类型作为泛型参数可能吗?

我遇到了一个非常奇怪的泛型类型约束。我有这样的课:

但是,我发现我不能像预期的那样使用可为空的类型:

我收到一个int?必须是引用类型的错误。Nullable 真的只是一个带有语法糖的结构,使它看起来像一个引用类型吗?