chr*_*isw 1 c# generics c#-4.0
如在C 3.5中发现的那样,由于类型擦除,以下是不可能的: -
int foo<T>(T bar)
{
return bar.Length; // will not compile unless I do something like where T : string
}
foo("baz");
Run Code Online (Sandbox Code Playgroud)
我认为这不起作用的原因是在C#和java中,由于一个叫做类型擦除的概念,请参见http://en.wikipedia.org/wiki/Type_erasure.
阅读完关于动态关键字后,我写了以下内容: -
int foo<T>(T bar)
{
dynamic test = bar;
return test.Length;
}
foo("baz"); // will compile and return 3
Run Code Online (Sandbox Code Playgroud)
所以,据我所知,动态将绕过编译时间检查,但如果类型已被删除,它肯定仍然无法解析符号,除非它更深入并使用某种反射?
以这种方式使用动态关键字是不好的做法,这是否使得泛型更强大?
动态和泛型是两个完全不同的概念.如果您希望编译时安全性和速度使用强类型(泛型或只是标准的OOP技术,如继承或组合).如果您在编译时不知道类型,则可以使用动态,但它们会更慢,因为它们使用运行时调用并且安全性较低,因为如果类型未实现您尝试调用的方法,则会出现运行时错误.
这两个概念是不可互换的,根据您的具体要求,您可以使用其中一个.
当然,具有以下通用约束是完全无用的,因为它string
是一个密封类型,不能用作通用约束:
int foo<T>(T bar) where T : string
{
return bar.Length;
}
Run Code Online (Sandbox Code Playgroud)
你宁愿拥有这个:
int foo(string bar)
{
return bar.Length;
}
Run Code Online (Sandbox Code Playgroud)