在C#中,为什么使用动态类型会允许我在仿制药上使用操作员



在类中,我们正在处理仿制药,并被要求完成作业。

我们使用一个属性private T _balance;创建了一个Account<T>类,然后不得不编写信用和借记_balance的方法。

Credit method(部分)从main调用,例如acc1.Credit(4.6);

    public void Credit(T credit)
    {
        Object creditObject = credit;
        Object balanceObject = _balance;
        Type creditType = creditObject.GetType();
        Type balanceType = balanceObject.GetType();
        if(creditType.Equals(balanceType))
        {
            if(creditType.Equals(typeof (double)))
            {
                 balanceObject= (double)balanceObject + (double)creditObject;
            }
       ...WITH more else if's on int,float and decimal.
        }
        _balance = (T)balanceObject;   
    }

我不得不调节检查和铸造,因为我无法_balance += (T)balanceObject;,因为这将给出错误"Operator '+' cannot be applied to operand of type 'T'"

在阅读有关该主题的过程中,我发现了dynamic类型。在我的新帐户类中,我添加了一种新方法,并将Credit方法更改为:(从main命名为e.g acc1.Credit(4.6);

    public void Credit(dynamic credit)
    {
        _balance += ConvertType(credit);
    }
    public T ConvertType(object input)
    {
        return (T)Convert.ChangeType(input, typeof(T));
    }

这就是我不明白的。信用方法以dynamic的类型和ConvertType(object input)的形式将其归为 T。为什么使用动态类型允许我使用仿制药?

使用dynamic类型时,将分辨率推迟到运行时。如果在运行时,通用类型支持+操作员,则您的代码将起作用。如果没有,它将抛出异常。

来自dynamic上的MSDN文章:

在编译时,假定为动态键入的元素 支持任何操作。

最新更新