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)
这种变化会不会有任何不利因素?
这种变化的一个缺点是编译器无法捕获由错别字引起的错误.例如,如果你写了
if (foo.Clone().Equalls(foo)) {
// ^^
// ||
// Here is a typo ==++
}
Run Code Online (Sandbox Code Playgroud)
如果你Clone()返回一个object,编译器会抓住它.dynamic对编译器进行更改会很好,因此您的程序会为缺少的方法抛出运行时异常.