返回动态的接口方法

Was*_*abi 4 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;
Run Code Online (Sandbox Code Playgroud)

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

现在,如果IClonable.Clone()返回了一个动态,那么底层类(在运行时)仍然是MyClass,但代码会变得稍微冗长:

MyClass foo = new MyClass(...);
MyClass bar = foo.Clone();
Run Code Online (Sandbox Code Playgroud)

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

das*_*ght 5

这种变化的一个缺点是编译器无法捕获由错别字引起的错误.例如,如果你写了

if (foo.Clone().Equalls(foo)) {
//                  ^^
//                  ||
// Here is a typo ==++
}
Run Code Online (Sandbox Code Playgroud)

如果你Clone()返回一个object,编译器会抓住它.dynamic对编译器进行更改会很好,因此您的程序会为缺少的方法抛出运行时异常.