【发布时间】:2013-04-19 00:44:47
【问题描述】:
正如在 C 3.5 中发现的那样,由于类型擦除,以下内容是不可能的:-
int foo<T>(T bar)
{
return bar.Length; // will not compile unless I do something like where T : string
}
foo("baz");
我相信这在 C# 和 java 中不起作用的原因是由于一个称为类型擦除的概念,请参阅http://en.wikipedia.org/wiki/Type_erasure。
阅读了dynamic 关键字后,我写了以下内容:-
int foo<T>(T bar)
{
dynamic test = bar;
return test.Length;
}
foo("baz"); // will compile and return 3
所以,据我了解,动态会绕过编译时检查,但如果类型已被删除,除非它更深入并使用某种反射,否则它肯定仍然无法解析符号?
以这种方式使用动态关键字是不好的做法吗?这会使泛型更强大吗?
【问题讨论】:
-
类型没有被删除,你可以手动测试
bar是string并进行相应的转换。泛型限制为已知的最低类型。T无约束就是object。转换为dynamic将使用 DLR 将任何成员检查移动到运行时,这实际上是鸭式打字。 -
使用动态是不错的做法,您只是将转换推送到运行时,但您需要检查转换异常
-
可能的答案here