C#是否可以创建可选的泛型类型约束

Rya*_*son 7 c# generics type-constraints

我想我知道答案,但是我需要指定泛型方法可以基于两个可选约束来获取类型.那就是T可以是一种类型或另一种类型.

public WebPage Click<T>(Func<WebPage> predicate) where T : LinkBase || FieldBase, new()
{
    WebDriver.FindElement(new T().LinkPath).Click();
    WebDriver.Wait();
    return predicate.Invoke();
}
Run Code Online (Sandbox Code Playgroud)

我知道目前没有这样的语法,但有没有办法解决这个问题而不重复约束两种类型的方法?如果没有,这是否可能用于该语言的未来版本?

Jon*_*Jon 6

如果LinkBase并且FieldBase没有共同基础或实现公共接口,那么这样做是没有意义的.如果他们这样做,那么你可以简单地使用那个作为约束.

我说它没有意义,因为使用类型约束的原因是确保使用的实际泛型类型参数支持已知的公共接口(否则,您可能只是将整个事物设置为非泛型和使用object).但是如果你有一个假设的"或"约束,那么编译器如何能够确保你在泛型中编写的代码对于最终被指定的类型参数实际上是有意义的?


Mik*_*rds 3

你是对的,没有办法将多种类型传递到泛型方法中。

你能控制这两种类型吗?你能让它们都实现相同的接口或抽象类吗?

  • 当然,我知道抽象可能是有问题的,但如果它只是一个属性,那么这里有一个接口应该可以解决问题,并且通过设计实践就可以了。否则,泛型方法无法接受多种类型,因为编译器需要确切地知道可以传入哪些属性,并且它不能仅仅推断两个不同类型具有相同的公共属性 (2认同)