将对象强制转换为动态是一种好习惯,以便调用正确的重载方法吗?

Mat*_*dge 20 c# coding-style dynamic c#-4.0

我的问题是下面是否适当使用dynamicC#4 中的关键字.

我有一些辅助方法,它们提供了比标准ToString方法更有用的各种对象表示,我用它来进行单元测试.这是一个简化的例子:

public static string PrettyPrint<T>(IEnumerable<T> list)
{
    return string.Join(", ", list);
}

// Needed because string is IEnumerable<char>, to prevent
// "Hello" -> "H, e, l, l, o"
public static string PrettyPrint(string s)
{
    return s;
}

public static string PrettyPrint(object o)
{
    return o.ToString();
}
Run Code Online (Sandbox Code Playgroud)

我用它们是这样的:

public static void PrettyPrinting()
{
    object[] things = { 1, "Hello", new int[] {1, 2, 3} };

    foreach (dynamic item in things)
    {
        Console.WriteLine(PrettyPrint(item));
    }
}
Run Code Online (Sandbox Code Playgroud)

这会产生以下输出:

1
Hello
1, 2, 3
Run Code Online (Sandbox Code Playgroud)

请注意,如果我将dynamic关键字替换为object,我会得到以下内容(所有调用都被路由通过PrettyPrint(object)),这就是我要避免的:

1
Hello
System.Int32[]
Run Code Online (Sandbox Code Playgroud)

所以我的问题基本上是代码气味objectdynamic这种方式投射到它是合法的吗?

Ada*_*kis 6

只要你不滥用它,像这样的鸭子打字dynamic就是加入语言的部分原因.

  • @errorstacks:`var`根本不是`动态'.两个截然不同的关键词 (6认同)
  • @errorstacks - var不仅适用于静态类型变量吗?我很确定你用var声明的任何东西都有一个在编译时已知的类型. (4认同)