Member 12275258 Ответов: 2

Не удалось передать ссылку на класс объекта


Привет, я только что перешел из семейства C++ в семейство C# и столкнулся с проблемой...
У меня есть 1 основной класс и 1 класс объектов.
Основной класс создаст класс объекта и установит в него значение.
Но я столкнулся с проблемами компиляции во время компиляции.


Severity	Code	Description	Project	File	Line	Suppression State
Error	CS1503	Argument 1: cannot convert from 'System.Collections.Generic.Dictionary<string, DeepLearningTools.FormMainFrame.ImageData>' to 'System.Collections.Generic.Dictionary<string, DeepLearningTools.FormImageLabel.ImageData>'	DeepLearningTools	D:\NPI Deep Learning\DeepLearningTools\FormMainFrame.cs	110	Active


Что я уже пробовал:

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;

namespace ConsoleApplication2
{
    class Program
    {
        public Dictionary<string, ImageData> _dictImageData = new Dictionary<string, ImageData>();
          Object _Object = new Object();
        public struct ImageData
        {
            public int _sizeX
            {
                get
                {
                    return _sizeX;
                }
                set
                {
                     _sizeX = value;
                }
            }
            public int _sizeY
            {
                get
                {
                    return _sizeY;
                }
                set
                {
                    _sizeY = value;
                }
            }
        }

        void Main(string[] args)
        {
            _Object.Set(ref _dictImageData);
        }
    }
}


using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;

namespace ConsoleApplication2
{
    class Object
    {
        public struct ImageData
        {
            public int _sizeX
            {
                get
                {
                    return _sizeX;
                }
                set
                {
                    _sizeX = value;
                }

            }

            public int _sizeY
            {
                get
                {
                    return _sizeY;
                }
                set
                {
                    _sizeY = value;
                }
            }
        }
        public Dictionary<string, ImageData> _dictImageData2 = new Dictionary<string, ImageData>();

        public void Set(ref Dictionary<string, ImageData> dict)
        {
            _dictImageData2 = dict; << the error happened at here
        }
    }

}

Richard MacCutchan

Где находится код, упомянутый в сообщении об ошибке? То есть D:\NPI Deep Learning\DeepLearningTools\FormMainFrame.cs, в строке 110.

2 Ответов

Рейтинг:
12

OriginalGriff

Во-первых, не звоните в свой класс Object В C# уже есть object класс, который является основой всех других структур и классов в языке. У него также есть синоним Object что относится к тому же классу.
Называть свой класс любым именем-это путь к путанице и ошибкам.

Во-вторых, вы не можете привести словарь к другому словарю типов значений, о чем говорит вам сообщение об ошибке:

cannot convert from 'System.Collections.Generic.Dictionary<string, DeepLearningTools.FormMainFrame.ImageData>' to 'System.Collections.Generic.Dictionary<string, DeepLearningTools.FormImageLabel.ImageData>'
Ключ может быть тот же, но значение
это не так - поэтому, если вы можете привести его (или использовать неявное приведение, когда вы передаете его в качестве параметра метода), то система может попытаться использовать методы или свойства, которые не существуют.

Предполагая,:
class Base {}
class DerivedA : Base { public int MyProperty { get; set; }}
class DerivedB : Base { void Callme() { } }
Точно так же, как вы не можете привести экземпляр DerivedA к экземпляру DerivedB, у вас есть та же проблема с "контейнерными" классами, такими как словари, и точно по той же причине.

Хотя у вас есть два "одинаковых" structs с одинаковым именем, они являются разными типами, насколько это касается системы, и вы не можете бросать между ними.

Переместите определение ImageData в его собственный файл и удалите его из обоих ваших классов, и он должен начать работать.


Member 12275258

Спасибо. Я меняю структуру на класс. Теперь все работает нормально.

OriginalGriff

Всегда пожалуйста!

Maciej Los

5ed!

Рейтинг:
0

Richard Deeming

Есть еще одна проблема, с которой вы столкнетесь с этим кодом:

Цитата:
public struct ImageData
{
    public int _sizeX
    {
        get
        {
            return _sizeX;
        }
        set
        {
             _sizeX = value;
        }
    }
    public int _sizeY
    {
        get
        {
            return _sizeY;
        }
        set
        {
            _sizeY = value;
        }
    }
}
Вы собираетесь получить StackOverflowException при попытке получить доступ к любому из свойств на вашем компьютере struct Похоже, вы пытались создать свойства с резервными полями, которые больше походили бы на:
public struct ImageData
{
    private int _sizeX;
    
    public int SizeX
    {
        get
        {
            return _sizeX;
        }
        set
        {
             _sizeX = value;
        }
    }
    
    private int _sizeY;
    
    public int SizeY
    {
        get
        {
            return _sizeY;
        }
        set
        {
            _sizeY = value;
        }
    }
}
Обратите внимание, что имя свойства и имя резервного поля различны, а имена свойств соответствуют стандартам именования C#.

Более простым вариантом было бы использовать авто-свойства:
public struct ImageData
{
    public int SizeX { get; set; }
    public int SizeY { get; set; }
}
Автоматически Реализуемые Свойства - Руководство По Программированию На C# | Microsoft Docs[^]

Это, как правило, также не желательно для struct чтобы быть неизменным:
public readonly struct ImageData
{
    public int SizeX { get; }
    public int SizeY { get; }
    
    public ImageData(int sizeX, int sizeY)
    {
        SizeX = sizeX;
        SizeY = sizeY;
    }
}


Member 12275258

Привет, Ричард, спасибо за обратную связь. Я проверю документы, чтобы получить больше понимания. :)

Maciej Los

5ed!