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

c# - 如何约束泛型类型参数以仅接受 C# 中的可为空值类型?

where T : struct约束仅允许将可接受类型参数的域限制为一组值类型(与包括值类型和引用类型的类型的超集相比),但似乎也完全禁止可空类型,尽管可空并不一定意味着现代版本的 C# 中的引用类型。

如果我想接受具有附加可空性的值类型(例如int?等)DateTime?同时拒绝原生可空引用类型(例如字符串、IList 等)怎么办?是否可以以这种方式定义约束?如果是怎么办?

我真的很想学习实现这两种场景:当用作参数的类型必须既是值又是可空的,以及当一个可空的值类型和不可为空的值类型一样被接受时,我认为这些相关足够接近以原谅提及这两种情况,所以我很感激对第二种情况的谦虚评论,并选择一个答案,包括它作为一个更好的答案(假设另一个答案在其他方面不会真的更好)如果多个答案将是提交,我必须选择,但我现在真正需要的是第一种情况(总是需要一个既可以为空又是值类型的类型),我也相信第二种情况会考虑到第一个知识,非常简单,更不用说坚持将 2 个问题合二为一不是一种好方法,所以我绝对会感激并接受仅处理第一个案例的答案。

0 投票
2 回答
62 浏览

c# - 我可以将泛型类型参数限制为仅接受实现特定泛型接口的类型并访问 C# 中的 IF 类型参数吗?

我想要做的是定义一个泛型类型ClassB<TA>,该类型将接受TA类型参数分配给实现泛型接口的任何类型,IInterfaceA<TB>以任何方式[接口定义允许],无论TB已传递给它的类型参数 ( IInterfaceA)在TA实施中。我还希望能够访问由定义中使用的特定实现TB实际传递给接口的类型参数 () 。这在 C# 中可能吗?如果是,那么正确的语法是什么?IInterfaceATAClassB<TA>

例如,类似以下的内容(我希望虽然看似说明性但不是特别有用)但在语法和语义上是正确的:

更新:到目前为止,我实际上已经采取了以下方式(在决定询问是否可能存在更好的方式之前),包括TBIInterfaceA类型参数)本身的定义,ClassB但我仍然很好奇是否ClassB可以定义方式这将只允许所有IInterfaceA实现并以一种隐式方式派生/导入IInterfaceA类型参数(不是 100% 确定,但似乎实际上具有逻辑明确(非模棱两可)的强类型意义,同时增加了我的代码可重用性,这就是我猜到这样的原因一个特性有机会实际存在)。

更不用说美学/可读性、可维护性、消除对针对略有不同情况的逻辑类似物的复制粘贴定义的需求等)。提到的替代解决方案意味着明确定义什么是相当直接的,以便由编译器明确地计算出来(至少在相同的接口没有使用不同类型参数实现两次的情况下,感谢@vyrp 强调了歧义的可能性多重实现案例)给定使用上下文(我认为这不仅是一种更方便的方式,而且更不容易出错)并限制了通用代码重用的机会。我相信这句话可以解释为什么一个不那么冗长的替代方案 提到的替代解决方案意味着明确定义什么是相当直接的,以便由编译器明确地计算出来(至少在相同的接口没有使用不同类型参数实现两次的情况下,感谢@vyrp 强调了歧义的可能性多重实现案例)给定使用上下文(我认为这不仅是一种更方便的方式,而且更不容易出错)并限制了通用代码重用的机会。我相信这句话可以解释为什么一个不那么冗长的替代方案 提到的替代解决方案意味着明确定义什么是相当直接的,以便由编译器明确地计算出来(至少在相同的接口没有使用不同类型参数实现两次的情况下,感谢@vyrp 强调了歧义的可能性多重实现案例)给定使用上下文(我认为这不仅是一种更方便的方式,而且更不容易出错)并限制了通用代码重用的机会。我相信这句话可以解释为什么一个不那么冗长的替代方案 感谢@vyrp 强调了在多个实现案例中可能存在歧义)给定使用上下文(我认为这不仅是一种更方便的方式,而且更不容易出错)并限制了通用代码重用的机会。我相信这句话可以解释为什么一个不那么冗长的替代方案 感谢@vyrp 强调了在多个实现案例中可能存在歧义)给定使用上下文(我认为这不仅是一种更方便的方式,而且更不容易出错)并限制了通用代码重用的机会。我相信这句话可以解释为什么一个不那么冗长的替代方案ClassB<TA, TB> where TA : IInterfaceA<TB>语法(作为实现上述逻辑的一种方式)完全可以搜索。

0 投票
0 回答
79 浏览

java - 使用泛型继承和重载方法

我有一个具有以下方法的类:

在一个子类中TypedMessage,我想重载这个方法。所以我做了以下事情:

T注意泛型的约束。它必须扩展TBase。这一切都编译得很好。现在,当我在这样声明的类中使用它时:

setBody()引发编译错误。它试图参考:

中方法的版本,TypedMessage而不是中的重载版本ThriftMessage

这很令人困惑,因为在我声明泛型参数的类中,我CQSEvent也有它扩展的约束TBase。谁能帮我理解为什么它不尝试引用重载版本?

更新:

这是错误消息

其中 CQSEvent 是一个类型变量: CQSEvent 扩展了在类 CQSTask 中声明的 TBase

0 投票
1 回答
317 浏览

delphi - 无法编译受约束的泛型方法

长话短说:以下代码在Delphi 10.1 Berlin (Update 2)中无法编译。

编译器会发出几条错误消息:

  1. E2015:运算符不适用于此操作数类型

    在线if T = TSomeComponent then

  2. E2010 不兼容的类型 - 'T' 和 'TSomeComponent'

    上线Result := TSomeComponent.Create(nil, AComponentString)

为了规避这些,我可以转换TClass(T)(对于#1),如LU RD在这里的回答中所述(尽管据说这个错误已经在XE6中修复)和T(TSomeComponent.Create(nil, AComponentString))(对于#2)。虽然,我对使用显式类型转换感到不舒服。

有没有更好的办法?编译器不应该识别,因为我明确限制了它T的类型吗?TComponent


起初,我尝试将泛型函数的实现声明为它的接口:

但这以错误告终

E2029: ',', ';' 或 '>' 预期但 ':' 找到

0 投票
3 回答
661 浏览

c# - C# 裸类型约束

在“C# 6.0 in a Nutshell”中有一个裸类型约束用法的示例:

老实说,我不明白为什么我应该在这里使用这个约束。如果我将其删除并将 U 更改为 T,结果将是相同的。那么有什么意义呢?

谢谢你。

0 投票
2 回答
2742 浏览

typescript - TypeScript - 通用约束可以提供“允许的”类型吗?

鉴于以下代码...

这会产生以下错误:

索引签名参数类型必须是“字符串”或“数字”。

有没有办法限制TKey为“字符串”或“数字”?

0 投票
1 回答
1123 浏览

swift - Swift 泛型:将类型参数约束到协议

您如何指定泛型类型参数只能是协议(或符合该协议的协议),而不是符合该协议的类?

例如:

如何指定泛型类型参数应该是协议?

我想限制T为仅符合(例如)的协议。但问题是,我不知道如何防止 T 成为一个类(例如)。MyProtocolMySubProtocolMyImplementation

我已经尝试过约束T.self(我试图使用where T.self : Protocol,但这导致了错误'self' is not a member type of 'T')。

那么如何指定T必须是符合的协议MyProtocol,而不是类如果那不可能,我至少可以指定 T 应该是任何协议吗?如果我需要制作一个仅类协议也可以。

MySubProtocol作为非泛型参数传递不是我想要的,因为我也希望能够将该协议用作InterfaceMaker.getProxy()函数的类型。此外,让该函数简单地返回MyProtocol(换句话说,InterfaceMaker是非泛型的)也不是一种选择。

注意:要完全清楚,我需要T成为协议的原因是我要将它传递给NSXPCInterface.init(with:),它需要 a Protocol(可以通过SomeProtocol.selfif SomeProtocolis获得@objc)。这意味着SomeProtocol.self.Type是或符合

如果这是不可能的,请给出完整的解释原因。还要提及是否有可能在未来的 Swift 版本中支持这一点。

编辑:另一种表述方式是T.self is AnyObject.Type永远不应该是真的。我宁愿在编译时检查这一点,而不是运行时检查或断言。

0 投票
2 回答
408 浏览

f# - 泛型约束中的 F# 错误

以下 F# 代码

let f<'T when 'T: (member Id:int)> (t:'T) = t.Id

不接受以下错误:

错误 FS0670 此代码不够通用。^T : (member get_Id : ^T -> int) 时的类型变量 ^T 无法泛化,因为它会超出其范围。

怎么了?如何解决?

编辑

@Fyodor:棘手!我做了一些测试,发现了更多的奇怪:

f1 在 <^T 中给出错误

错误 FS0010 模式中出现意外的中缀运算符

f2 在 ('T

错误 FS0583 不匹配 '('

错误 FS0010 绑定中出现意外的引号符号

接受 f3 和 f4

0 投票
1 回答
117 浏览

swift - 直接对泛型类型的类型约束与使用“where”子句之间有实际区别吗?

这两个功能之间的功能有什么实际区别吗?

它们似乎都可以正常编译和运行。想知道为什么有两种不同但看似相同的语法。

0 投票
2 回答
48 浏览

c# - 可以将通用约束与运算符重载结合起来吗?

我想知道是否可以使用通用约束(何时)允许此代码?

这样做的正确模式是什么?

我的问题是针对所有运营商的