将具体类转换为通用基接口

Sam*_*iff 2 c# generics casting interface base

这是我面临的情景:

public abstract class Record { }

public abstract class TableRecord : Record { }

public abstract class LookupTableRecord : TableRecord { }

public sealed class UserRecord : LookupTableRecord { }

public abstract class DataAccessLayer<TRecord> : IDataAccessLayer<TRecord>
    where TRecord : Record, new() { }

public abstract class TableDataAccessLayer<TTableRecord> : DataAccessLayer<TTableRecord>, ITableDataAccessLayer<TTableRecord>
    where TTableRecord : TableRecord, new() { }

public abstract class LookupTableDataAccessLayer<TLookupTableRecord> : TableDataAccessLayer<TLookupTableRecord>, ILookupTableDataAccessLayer<TLookupTableRecord>
    where TLookupTableRecord : LookupTableRecord, new() { }

public sealed class UserDataAccessLayer : LookupTableDataAccessLayer<UserRecord> { }

public interface IDataAccessLayer<TRecord>
    where TRecord : Record { }

public interface ITableDataAccessLayer<TTableRecord> : IDataAccessLayer<TTableRecord>
    where TTableRecord : TableRecord { }

public interface ILookupTableDataAccessLayer<TLookupTableRecord> : ITableDataAccessLayer<TLookupTableRecord>
    where TLookupTableRecord : LookupTableRecord { }
Run Code Online (Sandbox Code Playgroud)

现在,当我尝试执行以下演员时,它不会编译:

UserDataAccessLayer udal = new UserDataAccessLayer();
            ITableDataAccessLayer<TableRecord> itdal = (ITableDataAccessLayer<TableRecord>)udal;
Run Code Online (Sandbox Code Playgroud)

但是,当我执行以下转换时,它编译时没有运行时错误:

UserDataAccessLayer udal = new UserDataAccessLayer();
            ITableDataAccessLayer<UserRecord> itdal = (ITableDataAccessLayer<UserRecord>)udal;
Run Code Online (Sandbox Code Playgroud)

我真的需要使用基本ITableDataAccessLayer<TableRecord>接口,因为我不知道具体的类型.

希望这个描述性和帮助足以回答我的问题.

Jos*_*osh 5

您尝试执行的操作在.NET 4.0中受支持,但不支持3.5.它被称为通用协方差.在此期间您可以做的是创建一个名为ITableDataAccessLayer的非通用接口(使用类型Object,无论您使用何时使用T)并提供显式接口实现.这是.NET中有多少泛型类型处理它.