我有以下代码
public interface IEntity
{
int Id { get; set; }
}
public interface ICriteria<T> where T : class,IEntity
{
T GetResult(int id);
}
public class DummEntity : IEntity
{
public int Id { get; set; }
}
public class SimpleCriteria<T>:ICriteria<T> where T:class,IEntity
{
public T GetResult(int id)
{
return default(T);
}
}
这种类型的铸造应该工作吗?
SimpleCriteria<DummEntity> scr = new SimpleCriteria<DummEntity>();
ICriteria<IEntity> generic = (ICriteria<IEntity>)scr;
最佳答案
不是在C#3中,不是。尽管CLR自.NET 2.0开始就支持接口和委托的通用变体,但直到版本4才在C#中公开。
在C#4中,它将起作用-但只有在使ICriteria<T>
成为协变之后:
public interface ICriteria<out T> where T : class,IEntity
{
T GetResult(int id);
}
请注意,在C#3中,显式强制转换意味着它将进行编译-但在执行时将失败。
使用C#4和上述
ICriteria<T>
声明,转换是隐式的:SimpleCriteria<DummEntity> scr = new SimpleCriteria<DummEntity>();
ICriteria<IEntity> generic = scr;
关于c# - .net协方差规则,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/1445459/