Проблема с реализацией собственной версии KeyValuePair - PullRequest
0 голосов
/ 26 сентября 2018

В VS 2017 у нас есть реализация KeyValuePair, такая как

    namespace System.Collections.Generic
    {
        //
        // Summary:
        //     Defines a key/value pair that can be set or retrieved.
        //
        // Type parameters:
        //   TKey:
        //     The type of the key.
        //
        //   TValue:
        //     The type of the value.
        public struct KeyValuePair<TKey, TValue>
        {
            //
            // Summary:
            //     Initializes a new instance of the System.Collections.Generic.KeyValuePair`2 structure
            //     with the specified key and value.
            //
            // Parameters:
            //   key:
            //     The object defined in each key/value pair.
            //
            //   value:
            //     The definition associated with key.
            public KeyValuePair(TKey key, TValue value);

            //
            // Summary:
            //     Gets the key in the key/value pair.
            //
            // Returns:
            //     A TKey that is the key of the System.Collections.Generic.KeyValuePair`2.
            public TKey Key { get; }
            //
            // Summary:
            //     Gets the value in the key/value pair.
            //
            // Returns:
            //     A TValue that is the value of the System.Collections.Generic.KeyValuePair`2.
            public TValue Value { get; }

            //
            // Summary:
            //     Returns a string representation of the System.Collections.Generic.KeyValuePair`2,
            //     using the string representations of the key and value.
            //
            // Returns:
            //     A string representation of the System.Collections.Generic.KeyValuePair`2, which
            //     includes the string representations of the key and value.
            public override string ToString();
        }
    }

Я хотел бы реализовать свою собственную KeyValuePair с другим именем.Мой код

    namespace IEnumerableTest1
    {
        public struct ParameterNameValuePair<TParameterName, TValue>
        {
            public ParameterNameValuePair(TParameterName parameterName, TValue value);
            public TParameterName ParameterName { get; }
            public TValue Value { get; }
            public override string ToString();
        }
    }

Теперь у меня есть ошибка в коде:

Ошибка CS0501 'ParameterNameValuePair.ParameterNameValuePair (TParameterName, TValue)' должен объявить тело, поскольку оно не помечено как абстрактное, extern или частичное IEnumerableTest1

Ошибка CS0501 'ParameterNameValuePair.ToString ()' должно объявлять тело, поскольку оно не помечено как абстрактное, внешнее или частичное IEnumerableTest1

Как решить вышепроблемы?

Ответы [ 7 ]

0 голосов
/ 26 сентября 2018

Или прямо из Справочный источник

[Serializable]
public struct KeyValuePair<TKey, TValue> {
    private TKey key;
    private TValue value;

    public KeyValuePair(TKey key, TValue value) {
        this.key = key;
        this.value = value;
    }

    public TKey Key {
        get { return key; }
    }

    public TValue Value {
        get { return value; }
    }

    public override string ToString() {
        StringBuilder s = StringBuilderCache.Acquire();
        s.Append('[');
        if( Key != null) {
            s.Append(Key.ToString());
        }
        s.Append(", ");
        if( Value != null) {
           s.Append(Value.ToString());
        }
        s.Append(']');
        return StringBuilderCache.GetStringAndRelease(s);
    }
}
0 голосов
/ 26 сентября 2018

Это потому, что у вашего конструктора структуры и метода ToString нет тела.Добавьте их, и затем он должен скомпилироваться.

Пример:

public ParameterNameValuePair(TParameterName parameterName, TValue value)
{
  ParameterName = parameterName;
  Value = value;
}

public override string ToString()
{
  return $"{ParameterName.ToString()} {Value.ToString()}";
}
0 голосов
/ 26 сентября 2018

Visual Studio отображает Контракт типа данных, только если он не может получить доступ к источникам.Вы можете найти фактическую реализацию KeyValuePair<TKey, TValue> здесь .

В вашем конкретном примере вы должны предоставить реализацию для каждого метода, подобную этой:

public struct ParameterNameValuePair<TParameterName, TValue>
{
    public ParameterNameValuePair(TParameterName parameterName, TValue value)
    {
        ParameterName = parameterName;
        Value = value;
    }

    public TParameterName ParameterName { get; }
    public TValue Value { get; }
    public override string ToString()
    {
        return $"Parameter={ParameterName}, Value={Value}";
    }
}
0 голосов
/ 26 сентября 2018

Сообщение об ошибке довольно ясно: у вашего конструктора и ToString() отсутствуют тела.Код, который вы показали из KeyValuePair<,>, является всего лишь разновидностью контракта, а не реальным кодом.Настоящий код можно найти в справочном источнике

. Вы можете сделать это так:

 public struct ParameterNameValuePair<TParameterName, TValue>
 {
     // implement constructor to assign values
     public ParameterNameValuePair(TParameterName parameterName, TValue value)
     {
         ParameterName = parameterName;
         Value = value;
     }

     public TParameterName ParameterName { get; }
     public TValue Value { get; }

     // implement ToString() to return a meaningful string representation
     public override string ToString() => $"[{Key}]: {Value}";
 }
0 голосов
/ 26 сентября 2018

Эта ошибка происходит из-за отсутствия тела ваших функций, т.е. конструктора и перегруженного ToString (). Реализуйте ваш конструктор.Измените ваши свойства с помощью get и set

что-то вроде

public struct ParameterNameValuePair<TParameterName, TValue>
        {
            private TParameterName  key;
            private TValue value;
            public ParameterNameValuePair(TParameterName parameterName, TValue value)
            {
                 this.key = parameterName;
                 this.value= value;
            }

            public TParameterName ParameterName { get;}
            public TValue Value { get;}
            public override string ToString()
            {
                 return $"Key: {ParameterName.ToString()}, Value:{Value.ToString()}";
            }
        }
0 голосов
/ 26 сентября 2018

Конструктор нуждается в реализации:

public struct ParameterNameValuePair<TParameterName, TValue>
{
    public ParameterNameValuePair(TParameterName parameterName, TValue value)
    {
        ParameterName = parameterName;
        Value = value;
    }
    public TParameterName ParameterName { get; private set; }
    public TValue Value { get; private set; }
}
0 голосов
/ 26 сентября 2018

Вам необходимо реализовать методы.

Код, который VS показывает, когда вы переходите к определению для кода в сборке, генерируется в форме, которая сама по себе недопустима C #: если есть объявления функций, но нетреализация.Это очень полезно, когда вы хотите узнать о доступных членах типа, но не о том, как пишется код.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...