为什么我不能说'我<class>是我<abstract base =“”class =“”>`?</abstract> </class>

时间:2011-03-16 21:51:16

标签: .net inheritance casting

我的代码中有这个设置:

public abstract class ModelBase{}
public interface IModelbase<T>{}
public abstract class ModelBase<T> : ModelBase, IModelBase<T> {}
public class MyClass : ModelBase<int> {}

然后我被NHibernate给了一个FutureValue<MyClass>对象,我试着:

if (obj is IFutureValue<ModelBase>) // => false?
// or
if (obj is FutureValue<ModelBase>) // => false?
// (I changed NHibernate's source to make FutureValue public, for other uses)

同时,如果我直接将它转换为类型:

if (((IFutureValue<MyClass>)obj).Value is ModelBase) // => true!
// or
if (((FutureValue<MyClass>)obj).Value is ModelBase) // => true!

......认真吗?它在继承链中,是否有某种原因它没有查找它?检查调试器中的对象显示它实际上是MyClass,并且确实有ModelBase方法和属性,所以我怀疑它与NHibernate的代理有什么关系。

为什么.NET在这种情况下不会查找继承链?是否有一些我可以执行的关键字/演员技巧来实现它?或者我必须采用类似于以下的大型,笨重的设置:

if (obj is IFutureValue<MyClass>) return ((IFutureValue<MyClass>)obj).Value;
if (obj is IFutureValue<MyOtherClass>) return ((IFutureValue<MyOtherClass>)obj).Value;
// etc etc ad infinitum

编辑:这是在.NET 2.0中


edit2:(I)FutureValue的确切代码:

public interface IFutureValue<T>
{
    T Value { get; }
}
public class FutureValue<T> : IFutureValue<T>
{
    public delegate IList<T> GetResult();

    private readonly GetResult getResult;

    public FutureValue(GetResult result)
    {
        getResult = result;
    }

    public T Value
    {
        get
        {
            var result = getResult();

            if (result.Count == 0)
            {
                return default(T);
            }

            return result[0];
        }
    }
}

我只是非常误解协方差/逆变问题(在这种情况下,为什么Func<Type2, Type2> f1 = MyMethod;可以转换为Func<Type3, Type1> f2 = f1;(第一种类型是返回类型),但上面的代码不能同样的?除非只是.NET 2.0因多态而跛足?


edit3:打字时思考。是这种情况,因为IList<T>定义代理,例如,派生类型,因此需要Derived或DoublyDerived T,但返回类型只能是T或Base?所以我不能指挥任何一个方向......我想知道我是否可以说服NHibernate在他们的期货中切换到IEnumerable<T> ...会解决它吗?

1 个答案:

答案 0 :(得分:2)

IFutureValue<T>是具有协变类型参数的通用接口。您似乎期待 Contravariant 泛型类型参数的行为。 For more information, read the MSDN documentation on Covariance and Contravariance in Generics

相关问题