我想知道在用作泛型类型参数时是否dynamic在语义上等效object.如果是这样,我很好奇为什么存在这种限制,因为在为变量或形式参数赋值时两者是不同的.
我在C#4.0中编写了一个小实验来梳理一些细节.我定义了一些简单的接口和实现:
interface ICovariance<out T> { T Method(); }
interface IContravariance<in T> { void Method(T argument); }
class Covariance<T> : ICovariance<T>
{
public T Method() { return default(T); }
}
class Contravariance<T> : IContravariance<T>
{
public void Method(T argument) { }
}
Run Code Online (Sandbox Code Playgroud)
实验的有趣细节:
class Variance
{
static void Example()
{
ICovariance<object> c1 = new Covariance<string>();
IContravariance<string> c2 = new Contravariance<object>();
ICovariance<dynamic> c3 = new Covariance<string>();
IContravariance<string> c4 = new Contravariance<dynamic>();
ICovariance<object> c5 = new Covariance<dynamic>();
IContravariance<dynamic> …Run Code Online (Sandbox Code Playgroud)