我有以下代码

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/

10-13 06:06