Я столкнулся с некоторым странным поведением при использовании фальшивых фреймворков. Вероятно, это связано с этим блоком кода из фреймворка ms fakes:
public static implicit operator T(ShimBase<T> shim)
{
using (ShimRuntime.AcquireProtectingThreadContext())
{
return (shim == null) ? null : shim.GetInstance();
}
}
Я пытался издеваться над ObjectSet соотв. ObjectQuery , выполнив это:
internal class MyObjectEnumerable<TEntity> : ShimObjectQuery<TEntity>, IDbAsyncEnumerable<TEntity>, IQueryable<TEntity>
{
internal MyObjectEnumerable(ObjectQuery query) : base()
{
var _ = new ShimObjectQuery(query);
IncludeString = path => Instance;
Bind(this.AsEnumerable());
Bind(this.AsQueryable());
Bind((IDbAsyncEnumerable<TEntity>)this);
}
/* further shim implementation */
}
internal class MyObjectQueryProvider<TEntity> : IDbAsyncQueryProvider
{
public IQueryable CreateQuery(Expression expression)
{
// consuming the upper class
var shim = new MyObjectEnumerable<TEntity>(_query);
// this causes the InvalidCastExeption: MyObjectEnumerable<TEntity> to ObjectQuery in
// System.Data.Entity.QueryableExtensions.CommonAsNoTracking<T>(T source)
return shim;
// this avoids the implicit cast and works
return shim.Instance;
}
/* further shim implementation */
}
Теперь, почему это так?
Потребовалось некоторое время, чтобы выявить эту ошибку. Я много исследовал, но не смог найти дополнительную информацию.