문제

죄송합니다! 나는 코드에 너무있다! 컴파일러 오류를 넣는 것을 잊었습니다.

다음은 단순화 된 새로운 버전입니다!

그리고 이것은 오류입니다.

오류 1 'iweird.database.modifydata (ref iweird.idatatable)에 대한 가장 잘로드 된 메소드 일치에는 유효하지 않은 인수가 있습니다.
오류 2 인수 '1': 'ref iweird.periods'에서 'ref iweird.idatatable'으로 변환 할 수 없습니다.

문제 : 구조물이있는 인터페이스를 참조로 통과 할 수 없습니다. 내가 무엇을 잘못하고 있습니까?

새로운 예제 코드는 다음과 같습니다.

class PeriodsProcessor
    {
        public PeriodsProcessor()
        {
            Periods Data = new Periods();
            DataBase DB = new DataBase();

            Console.WriteLine(Data.Value);
            DB.ModifyData(ref Data);
            Console.WriteLine(Data.Value);

            Console.ReadLine();
        }
    }


    public interface IDataTable
    {
        string Value { get; set; }
    }

    public struct Periods : IDataTable
    {
        public string Value { get; set; }
    }

    public class DataBase
    {
        public void ModifyData(ref IDataTable data) 
        {
            data.Value = "CHANGE";
        }
    }

    class Program
    {
        static void Main(string[] args)
        {
            PeriodsProcessor PeriodsProcessor = new PeriodsProcessor();
        }
    }
도움이 되었습니까?

해결책

문제가 있습니다 DB.ModifyData<Period>(Data); 방법 호출. 당신의 Data 필드는 구조물이며 스트러크는 모든 방법으로 전달됩니다. 가치에 따라 즉, 메소드를 호출 할 때마다 복사 구조물이 생성되어 방법으로 전달됩니다. 그래서 실제로 당신의 ModifyData 메소드는 사본을 수정합니다 Periods 메소드 호출 직후에 버린 구조.

다른 팁

코드에서 구조물이있는 인터페이스를 전달하지 않으면 인터페이스를 구현하는 구조물을 전달합니다. 그것들은 완전히 다른 두 가지입니다. 당신의 문제를 해결하기 위해, 나는 구조물을 전혀 사용해야 할 이유가 없으므로 기간을 수업으로 바꾸겠습니다.

스트러크 참조 유형이 아닌 값 유형입니다. 참조로 전달하려면 사용해야합니다. ref 예어. 여전히 값 유형이라는 점을 명심하고 다른 변수에 할당하면 새 구조물이 생성됩니다.

라이센스 : CC-BY-SA ~와 함께 속성
제휴하지 않습니다 StackOverflow
scroll top