繁体   English   中英

在C#中,为什么使用动态类型允许我在泛型上使用运算符?

[英]In C#, why does using dynamic type allow me to use operators on generics?

在课堂上,我们正在处理泛型,并被要求完成一项任务。

我们创建了一个Account<T>类,其中一个属性为private T _balance; 然后不得不写信贷和借记_balance

通过例如acc1.Credit(4.6);从Main调用的Credit method (partial 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方法将对象作为dynamic类型, ConvertType(object input)将其作为类型T返回。 为什么使用动态类型允许我在泛型上使用运算符?

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

来自MSDN关于dynamic文章:

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

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM