【问题标题】:Constraints on parameters参数约束
【发布时间】:2012-03-15 21:26:36
【问题描述】:

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

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

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

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

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

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

【问题讨论】:

  • 你为什么要这样做?这些约束可用的唯一原因是让程序员可以调用方法、创建对象等......

标签: c# constraints params


【解决方案1】:

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

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

【讨论】:

    【解决方案2】:

    考虑到您正在谈论 strings numeric 类型,这是不可能的。如果条件是,您可以定义List&lt;T&gt; 类型的optional parameter,其中T 是任何选定的数字类型。

    【讨论】:

      【解决方案3】:

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

      【讨论】:

        【解决方案4】:

        这是一种可能的解决方案:

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

        虽然我想知道是否有任何理由需要对象为 IComparable 或 IConvertible,或者您是否只想将它们限制为已知类型(即字符串或数字)。我认为zmbq的答案可能是要走的路。或者您甚至可能真的只是想看看该对象是否实现了有用的ToString 方法。 Here's a way 找出答案(不是编译时限制,如您所料,而是在运行时使用反射)。

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 2021-09-04
          • 2019-10-11
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          相关资源
          最近更新 更多