“错误CS0118:'字段'用作具有类型字段的'类型'”

时间:2011-11-29 19:23:22

标签: c# casting

我正在编写一个包含任何类型变量的类。为此,我将变量(作为object引用)及其Type存储起来。但是当我尝试将object强制转换回正确的类型时,我得到错误CS0118,因为我使用了一个字段(类型为Type)作为类型。

这是我的班级:

public class Node
{
    Type m_oType = null;
    public Type Type 
    { 
        get { return m_oType; }
        set { m_oType = value; }
    }

    object m_oValue = null;
    public object Value
    {
        get { return m_oValue; }
        set
        {
            if (m_oValue == null)
            {
                if (value is m_oType) // ERROR CS0118
                {
                    m_oValue = value;
                }
            }
        }
    }
}

我尝试在线搜索一种方法(即使用强制转换运算符,asis),但我不断获得有关投射变量的基本教程。有人可以给我一个指针,告诉我如何实现这一目标吗?谢谢。

2 个答案:

答案 0 :(得分:3)

我怀疑你想要这样的东西(但请继续阅读):

if (m_oType.IsAssignableFrom(value.GetType()))

请注意,我们在 m_oType上将其称为,而不是将m_oType 传递给。从IsAssignableFrom的返回值上的文档开始,其中c是参数:

  

如果c和当前Type表示相同的类型,或者当前Type在c的继承层次结构中,或者当前Type是c实现的接口,或者c是泛型类型参数且是current Type表示c。

的约束之一

例如,typeof(object).IsAssignableFrom(typeof(string))会返回true,因为object位于string的继承层次结构中。

编辑:如上所述,如果m_oType为空或value为空,则会中断。我们可以轻松地绕value null,但如果m_oType为空,则不清楚您期望它做什么。也许你应该在Type属性(和构造函数)的setter中阻止它?然后使用:

// This will always store a null
if (value == null || m_oType.IsAssignableFrom(value.GetType()))

// This will never store a null
if (value != null && m_oType.IsAssignableFrom(value.GetType()))

答案 1 :(得分:2)

这样的东西
if (m_oType.IsAssignableFrom(value.GetType()))

但我很确定你应该看看泛型。

public class Node<T>
{
    T m_oValue = null;
    public T Value
    {
        get { return m_oValue; }
        set
        {
            if (m_oValue == null)
            {
                m_oValue = value;
            }
        }
    }
}