【问题标题】:Variant Type in C#C#中的变体类型
【发布时间】:2019-07-27 23:12:39
【问题描述】:

VBA(我假设是 VB)有一个 Variant 类型,我相信它会占用更多内存,但涵盖了各种数据类型。

在 c# 中是否有等价物?

在 windows 窗体中说我有以下内容,我将如何修改 z 的类型以使其正常运行

    private void uxConvertButton_Click(object sender, EventArgs e)
    {
        int x = 10;

        byte j = (byte)x;
        upDateRTB(j);

        long q = (long)x;
        upDateRTB(q);

        string m = x.ToString();
        upDateRTB(m);
    }

    void upDateRTB(long z) {
        MessageBox.Show(this,"amount; "+z);
    }

【问题讨论】:

    标签: c# types


    【解决方案1】:
    void upDateRTB(object z) {
        MessageBox.Show(this, "amount; " + Convert.ToString(z));
    }
    

    【讨论】:

      【解决方案2】:

      对象参数可以接受所有参数,但如果您希望变量保持强类型(并避免在此过程中装箱),您可以使用泛型:

      void upDateRTB<T>(T z) {
          MessageBox.Show(this,"amount; "+ Convert.ToString(z)); 
      }
      

      方法调用可以保持完全相同,因为编译器可以根据给定参数解析泛型类型。

      【讨论】:

      • 我是 C# 新手; generics 的这种语法:&lt;T&gt;(T z) 我还没有遇到过
      【解决方案3】:

      如果您说的是 "variant" 在 c# 中输入,请查看dynamic type in .net 4.0

      但要解决您的任务,在您的MessageBox.Show 中使用z.ToString() 就足够了

      【讨论】:

        【解决方案4】:

        动态关键字或对象类型可以为您提供所需的变体行为,但是:

        在这种情况下,我会将函数更改为:

        void upDateRTB(string z) {
            MessageBox.Show(this,"amount; " + z);
        }
        

        因为这就是方法所需要的全部。

        【讨论】:

        • 仅将参数更改为字符串不起作用 - 尝试一下。那我还需要修改其他代码。我只是要修改反对
        • 你需要考虑的是函数的使用。你想让它接受任何类型吗?
        • 完全正确 - 我希望能够添加额外的部分,使用我在 OP 中指定的 3 之外的其他类型调用函数
        • 如果是这样,您将必须确保所有被传递的类型都以有意义的方式实现 ToString,并以数量为前缀。将字符串作为参数的类型强制并允许调用者准确指定文本。
        【解决方案5】:

        "amount; "+z 隐式调用 z 上的 ToString 方法。 所以你可以使用类型object:

        void upDateRTB(object z) {
            MessageBox.Show(this,"amount; "+z);
        }
        

        你也可以用动态的,不过我没看出重点:

        void upDateRTB(dynamic z) {
            MessageBox.Show(this,"amount; "+z);
        }
        

        【讨论】:

        • dynamic 有更多开销吗?这就是你选择object 的原因吗?
        • 是的,它有。 dynamic 需要在运行时找出类型
        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2011-07-31
        • 2022-01-02
        • 2021-12-08
        • 2017-10-12
        • 2011-06-14
        相关资源
        最近更新 更多