6

在课堂上,我们一直在处理泛型,并被要求完成一项作业。

我们创建了一个Account<T>具有一个属性的类private T _balance;,然后必须编写 credit 和 debit 方法_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类型。在我的新 Account 类中,我添加了一个新方法并将该Credit方法更改为:(由例如 Main 调用acc1.Credit(4.6);

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

这是我不明白的。credit 方法将对象作为类型接收dynamicConvertType(object input)并将其作为类型返回T。为什么使用动态类型允许我在泛型上使用运算符?

4

1 回答 1

6

使用dynamic类型时,解析会延迟到运行时。如果在运行时泛型类型支持+运算符,则您的代码将起作用。如果没有,它会抛出异常。

来自MSDN文章dynamic

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

于 2012-10-19T18:55:20.173 回答