返回动态的接口方法

时间:2014-06-06 01:02:07

标签: c# interface dynamictype

如果从.NET 4.0发布版本开始,所有界面方法都从返回对象更改为返回动态,那么会不会有任何缺点?

现有的代码不必因为它而改变,因为底层类型仍然是相同的,并且会使代码稍微冗长。

public class MyClass : IClonable
{
    //...
    public object Clone()
    {
        //...
        return new MyClass(...);
    }
}

MyClass foo = new MyClass(...);
MyClass bar = foo.Clone() as MyClass;

上述代码详细程度的唯一减少是将 foo bar 的声明更改为 var

现在,如果 IClonable.Clone()返回动态,则基础类(在运行时)仍然是 MyClass ,但是代码会变得稍微冗长:

MyClass foo = new MyClass(...);
MyClass bar = foo.Clone();

这种改变会不会有任何不利因素?

2 个答案:

答案 0 :(得分:5)

此更改的一个缺点是编译器无法捕获错别字导致的错误。例如,如果你写了

if (foo.Clone().Equalls(foo)) {
//                  ^^
//                  ||
// Here is a typo ==++
}

当您的Clone()返回object时,编译器会抓住它。如果更改为dynamic,编译器就可以正常运行,因此您的程序会为缺少的方法抛出运行时异常。

答案 1 :(得分:3)

是的,一个主要缺点是动态不能提供编译时安全......或者有用的智能感知。因此,不仅需要更长的时间并且更容易出错访问对象的属性,而且如果你确实犯了错误,那么直到运行时才会捕获它。

并非总是如此,但通常可以通过仿制药更好地避免你给出的“冗长”的例子。 ICloneable是一个接口的示例,由于某种原因(可能是历史性的)没有通用版本,但是当存在通用版本时,它意味着您可以返回所需的确切类型而不是必须的对象被投了。