参数约束

本文关键字:参数约束 | 更新日期: 2023-09-27 18:28:02

我有一个方法可以注销数据,并使用params关键字获取大量输入

public static void LogData<T>(params object[] parameter)
{
    // log out the data
}

我想将输入限制为字符串和数字类型,我的第一个想法是使用where子句。显而易见的问题是,不能在where子句中使用具体类型,但可以通过注意字符串和数字类型都是IComparable和IConvertable来解决这一问题。我认为这可能会有所帮助:

public static void LogData<T>(params T[] parameter)
    where T : IComparable, IConvertible
{
    // log out the data
}

这不起作用,因为所有的输入都必须是一种类型。

有没有办法使用params关键字或其他语法将输入限制为字符串和数字类型?

参数约束

当每个对象都有一个ToString方法时,我不知道为什么要这样做。

无论如何,您可以声明一个新的类NumberOrString,它将支持字符串和您想要支持的数字类型的隐式转换。然后让LogData方法接受params NumberOrString[] p

考虑到您谈论的是stringsnumeric类型,这是不可能的。如果条件为,则可以定义类型为List<T>optional parameter,其中T是任何选定的数字类型。

我会使用我想要支持的类型创建多个方法,这些方法本质上是重载。可能有太多的代码和重复性,但基本的"注销数据"例程基本上可以在所有重载中重复使用。

这里有一个潜在的解决方案:

public static void LogData(params IConvertible[] parameter)
{
    // log out the data
}

尽管我想知道是否真的有任何理由需要对象是IComparable或IConvertable,或者是否只想将它们限制为已知类型(即字符串或数字)。我认为zmbq的答案可能是正确的。或者,您可能真的只是想看看该对象是否实现了一个有用的ToString方法。这里有一种方法可以找到它(不像您所期望的那样,不是编译时的限制,而是在运行时使用反射)。