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

c# - 创建将 T 限制为枚举的通用方法

我正在构建一个函数来扩展这个Enum.Parse概念

  • 允许在未找到 Enum 值的情况下解析默认值
  • 不区分大小写

所以我写了以下内容:

我得到一个错误约束不能是特殊类System.Enum

很公平,但是是否有一种解决方法来允许通用枚举,或者我将不得不模仿该Parse函数并将类型作为属性传递,这会强制对您的代码进行丑陋的装箱要求。

编辑以下所有建议都非常感谢,谢谢。

已经确定(我已经离开循环以保持不区分大小写 - 我在解析 XML 时使用它)

编辑:(2015 年 2 月 16 日)Christopher Currens在下面的 MSIL 或 F# 中发布了一个编译器强制类型安全的通用解决方案,非常值得一看,并点赞。如果解决方案在页面上进一步冒泡,我将删除此编辑。

编辑 2:(2021 年 4 月 13 日)由于这个问题现在已经得到解决和支持,自 C# 7.3 以来,我已经改变了接受的答案,尽管全面阅读顶级答案对于学术和历史兴趣是值得的 :)

0 投票
5 回答
688 浏览

c# - 如何在具有值类型约束的泛型声明类型之间进行复制

我有一个在值类型之间复制值的通用方法。即使使用结构约束,以下方法也会产生设计时错误。知道如何在值之间复制或转换吗?

0 投票
8 回答
94503 浏览

c# - C# 中是否有带有参数约束的通用构造函数?

在 C# 中,您可以对通用方法施加约束,例如:

您指定的地方T应该有一个不需要参数的构造函数。我想知道是否有办法添加一个约束,比如“存在一个带float[,]参数的构造函数?

以下代码无法编译:

解决方法也有用吗?

0 投票
1 回答
1303 浏览

c# - 通用约束:强制类型具有静态函数和带参数的构造函数

我知道你可以写:

强制它T有一个空的构造函数。

我的问题是:

  1. 您可以强制执行T具有特定类型参数的构造函数吗?喜欢:

    /li>
  2. 你能强制它T有一个静态函数(比如说,void F()),以便你可以在泛型类中使用这个函数吗?喜欢 :

    我知道你可以指定T实现一个接口,但我不希望这样。我想指定它T具有静态功能。

0 投票
1 回答
1044 浏览

.net - 通用约束中的枚举

我为 Enums (Enumerations) - 建立了一个扩展方法,命名它,说GetEnumSecondName

现在,我有一个通用方法,它应该采用 Enumeration 并返回该类型的所有第二个名称。

有解决方法吗?

编辑:

据我了解(感谢 Jon Skeet),C# 不支持薄型约束。如果有 VB.NET 专家确认“普通”VB.NET 也不支持。谢谢。

0 投票
1 回答
197 浏览

generics - F#:帮助创建看似动态的类型的成员约束

我一直在寻找一种将一些鸭子类型添加到 F# 方法的方法。

传入的参数在哪里有测试方法。我见过这样的符号:

在我看来,通用约束可以用于方法级别而不是类/接口级别。问题是由于类型问题我无法编译它。这让我相信没有办法在方法级别指定约束。那是正确的吗?

0 投票
4 回答
228 浏览

c# - 需要帮助来理解这个 C# 泛型类

我正在学习 Nhibernate 3.0。在其中一个示例代码示例中,它创建了一个抽象基实体类:

然后,使Customer实体从Entity基类继承:

我知道它是一个抽象的泛型类,它使用where关键字来确保类型TEntity<T>,这就是我感到困惑的地方。

Customer继承自 " Entity<Customer>",this " Entity<Customer>" 采用 " Customer" as T,但 thisCustomer不是 " Entity<T>"。

请帮助我理解这一点,我真的对这个通用类感到困惑。

0 投票
3 回答
2000 浏览

c# - C# 泛型约束中的通配符

我知道 C# 没有通用通配符,并且可以通过通用方法实现类似的效果,但是我需要在字段中使用通配符,并且无法确定是否有任何方法对其进行编码。

当然,这不起作用,因为要添加的对象不是 type State<Thing>,而是 type State<T> where T : Thing。是否可以将列表的最内部类型调整为 Java 等价物? extends Thing而不仅仅是Thing

0 投票
4 回答
6495 浏览

c# - 为什么泛型类型约束不可继承/分层强制执行

物品类别

具有泛型类型约束的基本抽象类

没有约束的继承类

我想知道为什么泛型类型约束不能继承?因为如果我的继承类继承自基类并传递其对基类有约束的泛型类型,则它自动意味着继承类中的泛型类型应该具有相同的约束,而无需显式定义它。不应该吗?

我做错了什么,理解错了,还是泛型类型约束真的不可继承?如果后者是真的,那世界上为什么会这样呢?

一点补充说明

为什么我认为在一个类上定义的泛型类型约束应该在子类上继承或强制执行?让我给你一些额外的代码,让它不那么明显。

假设我们拥有上述所有三个类。然后我们也有这个类:

正如我们所看到的,这个类不继承自,Item因此它不能用作具体类ClassBase<DanteItem>(暂时忘记它是抽象的事实ClassBase。它也可以是一个常规类)。由于MyClass没有为其泛型类型定义任何约束,因此拥有MyClass<DanteItem>...

但。这就是为什么我认为泛型类型约束应该像成员泛型类型约束一样在继承的类上继承/强制执行,因为如果我们查看MyClass它的定义:

T什么时候DanteItem我们可以看到它不能自动使用,MyClass因为它继承自ClassBase<T>并且DanteItem不满足其泛型类型约束。我可以说 **generic type onMyClass取决于ClassBase泛型类型约束,因为否则MyClass可以用任何类型实例化。但我们知道这是不可能的。

当我MyClass定义为:

在这种情况下, T 与基类的泛型类型没有任何关系,因此它独立于它。

这都是有点长的解释/推理。我可以简单地总结为:

如果我们不为其提供泛型类型约束,MyClass则隐含地暗示我们可以MyClass使用任何具体类型进行实例化。但我们知道这是不可能的,因为MyClass它继承自ClassBase并且具有泛型类型约束。

我希望这现在更有意义。

0 投票
2 回答
199 浏览

c# - 通用约束——我不确定如何用非此即彼的情况来解决这种情况

基本上我有以下几点:

问题是我不能这样做,因为即使约束不同,您也不能拥有具有相同签名的成员。但是,没有办法说明约束是IComparableOR IComparable<T>。所以,我不确定除了挑选一个并继续使用它之外还能做什么。而且,无论我选择哪一个,我都会输掉另一个,因为它们是分开的并且不会相互继承(这是有道理的)。

我是否在这里遗漏了一些东西,有一种方法可以同时使用两者,还是我必须选择一个(可能是通用版本)?