그것은 가능한으로 제한하는 방법에 대한 기록을 만?

0

질문

가정하자 나는 여러 가지 서로 다른 record-형식으로 일반 인터페이스는 다음과 같다:

record Rec1(
    string Tag
    ) : IFoo;

record Rec2(
    int Num,
    string Tag
    ) : IFoo;

record Rec3(
    bool Flag
    ) : IFoo
{
    public string Tag { get; init; }
    public double Value { get; init; }
}

// ... others ...

interface IFoo
{
    string Tag { get; }
}

나의 목표는 함수를 작성하여 업데이트 태그 속성을 통해 기록 clonation.

지금는 경우,형식으로 알려져,내가 쓸 수 있는 무언가 이것을 좋아한다:

    private Rec2 Update(Rec2 rec, string tag)
    {
        return rec with { Tag = tag };
    }

그러나 내가 피를 쓰고 무리의 오버로드,그래서 그는지 궁금하네요가 있다면 더 많은 일반적인 방법을 달성했다. 예를 들면,나는 유혹을 쓰:

    private TRec Update<TRec>(TRec rec, string tag) where TRec : IFoo
    {
        return rec with { Tag = tag };
    }

하지만 그렇지 않은 컴파일하기 때문에, TRec 수 아무것도(class, struct,etc.),지 record 어디에 사용할 수 있습니다 with 문입니다. 방법으로,없 record-제약 조건 내가 적용될 수 있습니다.

그래서,어떤 해결 방법? 그것은 아무것도 기대하는 해결해야 할까요?

보너스로 질문(단위해 호기심),는 이유 record-번역 등이 표시 되지 않으면 특별한 인터페이스를 만들기 위해 with 문 작업에 대하여?

c# constraints generics record
2021-11-20 05:42:41
2

최고의 응답

1

대 빈베이스 기록에는,이러한 모든 레코드에서 상속되는 공유 기본 레코드를 구현하는 인터페이스::

record R : IFoo ...

record Rec1 : R....
record Rec2 : R....

private TRec Update<TRec>(TRec rec, string tag) where TRec : R
{
    return rec with { Tag = tag };
}
2021-11-20 07:03:58

동의,모 better!
Mario Vernari

이럴,하지만 더 나아 보이지만 실제로 더 나은-하지만 당신이 사용하지 않는다""마커를는 냄새가 코드에,당신은 실제로 상속 사용해야하는 방법이 사용됩니다.
Zohar Peled
0

덕분에 또 다른 대답이(링크를 참조하십시오)코멘트에,그것은 있을 것 같 해키 해결 방법:

record R();

record Rec1(
    string Tag
    ) : R, IFoo;

// ... others ...

interface IFoo
{
    string Tag { get; init; }
}

private TRec Update<TRec>(TRec rec, string tag) where TRec : R, IFoo
{
    return rec with { Tag = tag };
}

제약 조건을 효과적으로 R 기록하는 동안, Tag 지정 감사 init accessor.

다시 나처럼 해킹보다는 실제 솔루션입니다. 내가 참조하는 것을 선호하는 몇 가지 기본을 지원합니다.

2021-11-20 06:57:32

다른 언어로

이 페이지는 다른 언어로되어 있습니다

Русский
..................................................................................................................
Italiano
..................................................................................................................
Polski
..................................................................................................................
Română
..................................................................................................................
हिन्दी
..................................................................................................................
Français
..................................................................................................................
Türk
..................................................................................................................
Česk
..................................................................................................................
Português
..................................................................................................................
ไทย
..................................................................................................................
中文
..................................................................................................................
Español
..................................................................................................................
Slovenský
..................................................................................................................