제네릭 인터페이스 유형의 멤버로 암시 적으로 캐스팅 할 수없는 제네릭 인터페이스를 닫는 클래스의 인스턴스

아론

나는 SO와 Google에서 이것을 꽤 많이 조사했습니다. 내 C # 앱은 long, decimal 및 float 유형의 결과를 처리 할 수 ​​있어야합니다. 일반 인터페이스를 만든 다음 각 결과 유형에 대해 닫는 옵션을 탐색했습니다.

다음은 샘플 코드입니다.

using System;

interface IResult<T>
{
    T Result();
    void Increment(T value);
}

public class ResultLong : IResult<long>
{
    private long result;

    public long Result()
    {
        return result;
    }

    public void Increment(long value)
    {
        result += value;
    }
}

public class App<T> where T : IConvertible
{
    private IResult<T> result;

    public void Run()
    {
        result = new ResultLong();
    }
}

이것은 오류를 제공합니다.

암시 적으로 'ResultLong'형식을 'IResult'로 변환 할 수 없습니다. 명시 적 변환이 존재합니다 (캐스트가 누락 되었습니까?).

캐스트를 추가하면 컴파일러 오류가 수정되지만 Increment 메서드는 다음을 throw합니다.

int에서 T로 변환 할 수 없습니다.

public void Run()
{
    result = (IResult<T>)new ResultLong();
    result.Increment(500);
}

이 전반적인 접근 방식이 유효한지, 그렇다면 어떻게 작동 할 수 있는지 알려주세요. 잘못된 접근 방식이라면 무엇을 권장합니까?

감사! 아론

나는 또한 언급해야한다. 이것은 내가 현재 그것을 다루는 방법이다.

using System;
public class Result
{
    public long ResultLong { get; set; }
    public decimal ResultDecimal { get; set; }
    public double ResultFloat { get; set; }
    public DateTime ResultDateTime { get; set; }

    public void Increment<T>(T value) where T : IConvertible
    {
        if (value is int || value is long)
        {
            ResultLong += value.ToInt64(null);
        }
        else if (value is decimal)
        {
            ResultDecimal += value.ToDecimal(null);
        }
        else if (value is double)
        {
            ResultFloat += value.ToDouble(null);
        }
        else if (value is DateTime)
        {
            ResultDateTime = value.ToDateTime(null);
        }
    }
}

그리고 제안 사항을 살펴본 후 기본 메서드 오버로딩을 사용하기로 결정했으며 지금까지 앱이 제대로 작동하는 것 같습니다.

public void Increment(int value)
{
    ResultLong += value;
}
public void Increment(long value)
{
    ResultLong += value;
}

public void Increment(double value)
{
    ResultDouble += value;
}

public void Increment(decimal value)
{
    ResultDecimal += value;
}

public void Increment(DateTime value)
{
    ResultDateTime = value;
}

그래서 C #을 배우는 데있어 많은 장애물을 극복하는 데있어 나의 기본 가이드였습니다. 이것이 저의 첫 번째 질문이었고 모든 분들의 답변에 감사드립니다.

user1023602

ResultLong은 IResult<long>이고 아니므로 IResult<T>오류 메시지가 표시됩니다.

을 사용 long하고 있기 때문에 제네릭 유형 구문이 실제로 필요하지 않습니다 (이미 유형이 무엇인지 알고 있기 때문입니다).

public class App 
{
    private IResult<long> result;

    public void Run()
    {
        result = new ResultLong();
        result.Increment(500);
    }
}

이 기사는 인터넷에서 수집됩니다. 재 인쇄 할 때 출처를 알려주십시오.

침해가 발생한 경우 연락 주시기 바랍니다[email protected] 삭제

에서 수정
0

몇 마디 만하겠습니다

0리뷰
로그인참여 후 검토

관련 기사

Related 관련 기사

뜨겁다태그

보관