제네릭을 사용하여 참조하여 스트러크와의 인터페이스
-
19-09-2019 - |
문제
죄송합니다! 나는 코드에 너무있다! 컴파일러 오류를 넣는 것을 잊었습니다.
다음은 단순화 된 새로운 버전입니다!
그리고 이것은 오류입니다.
오류 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
예어. 여전히 값 유형이라는 점을 명심하고 다른 변수에 할당하면 새 구조물이 생성됩니다.