«Ошибка CS0118:« поле »используется как« тип »» с полем «Тип» - PullRequest
0 голосов
/ 29 ноября 2011

Я пишу класс, который содержит переменную любого типа. Для этого я сохраняю как переменную (как ссылку 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;
                }
            }
        }
    }
}

Я пытался найти в Интернете способ сделать это (то есть, используя операторы приведения, as и is), но я продолжаю получать одни и те же базовые учебные пособия о приведении переменных. Может ли кто-нибудь дать мне указание о том, как я могу добиться этого? Благодарю.

Ответы [ 2 ]

3 голосов
/ 29 ноября 2011

Я подозреваю, что вы хотите что-то вроде этого (но читайте дальше):

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

Обратите внимание, что мы называем это на m_oType, не передавая m_oType до это.Из документов на возвращаемое значение IsAssignableFrom, где c - параметр:

true, если c и текущий тип представляют один и тот же тип, или еслитекущий Тип находится в иерархии наследования c, или если текущий Тип является интерфейсом, который реализует c, или если c является параметром универсального типа, и текущий Тип представляет одно из ограничений c.

Например, typeof(object).IsAssignableFrom(typeof(string)) возвращает true, потому что object находится в иерархии наследования string.

РЕДАКТИРОВАТЬ: Как уже отмечалось, он прервется, если либо m_oType будет нулевым, либо valueнулевой.Мы можем легко обойти value, будучи null, но не ясно, что вы ожидаете от него, если m_oType равно нулю.Возможно, вам следует предотвратить это в установщике для свойства Type (и конструктора)?Затем используйте:

// 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()))
2 голосов
/ 29 ноября 2011

Что-то вроде

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;
            }
        }
    }
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...