문제

MFC로 작업 할 때 다시 기억할 수 있습니다. 여러 버전의 MFC 프레임 워크를 확인하여 _MFC_VER 매크로.

나는 지금 .NET 4로 일을하고 있으며 몇 개의 지점에서 튜플을 사용하고 싶지만 여전히 다른 모든 것을 3.5와 호환 할 수 있습니다.

나는 다음과 같은 것을 찾고 있습니다.

#if DOTNET4
    public Tuple<TSource, TResult> SomeMethod<TSource, TResult>(){...}
#else
    public KeyValuePair<TSource, TResult> SomeMethod<TSource, TResult>(){...}
#endif
도움이 되었습니까?

해결책

사용할 수있는 내장 프리 컴파일러 상수는 없습니다. 그러나 각 구성과 고유 한 정의 상수 세트와 대상 프레임 워크 버전을 갖는 각 구성과 함께 자신만의 빌드 구성을 쉽게 만들 수 있습니다. 많은 사람들이 조건부로 32 또는 64 비트 차이를 컴파일하기 위해이 작업을 수행합니다.

다른 팁

.csproj (또는 .vbproj, 이론적으로)에서 사용자 정의 컴파일 기호를 정의 할 때 알아야 할 큰 경고가 있습니다. 이전에 정의 된 모든 컴파일 기호를 덮어 씁니다. 예를 들어 MSBuild 스 니펫을 고려하십시오.

  <PropertyGroup Condition="'$(TargetFrameworkVersion)' == 'v4.0'">
    <DefineConstants>$(DefineConstants);DOTNET_40</DefineConstants>
  </PropertyGroup>
  <PropertyGroup>
    <DefineConstants>ITS_CLOBBERING_TIME</DefineConstants>
  </PropertyGroup>

두 번째 정의 구성 요소는 그 값이 알 수 있듯이 정의의 첫 번째 값을 클로브합니다. 이를 피하려면 두 번째 정의 구성 요소를 다시 작성하여 다음과 같이 보이게하려고합니다.

    <DefineConstants>$(DefineConstants);ITS_CLOBBERING_TIME</DefineConstants>

또한, 이것을 정의 된 속성 그룹 안에 배치하고 싶을 것입니다. ~ 후에 Visual Studio 2010과 같이 다른 모든 PropertyGroups는 현재 사용자 정의 컴파일 기호를 추가하여 Visual Studio가 정의하기 전에 배치 된 경우 정의하는 다른 사용자 정의 컴파일 기호를 막을 수있는 방식으로 추가됩니다. 이 문제를 Microsoft에 제출했습니다. 진행 상황을 추적 할 수 있습니다 Microsoft Connect.

참고로, 조건부 편집 코드는이를 만나는 프로그래머를 좌절시킵니다.

주석을 바탕으로 편집

자신의 수업을 작성하는 것이 더 나을 것입니다. 그래서 당신은 그것이 할 일을 보장 할 수 있고, 이상한 서명이나 상속 문제가 없습니다.

public class Pair<TSource, TResult>
{
    public TSource Source { get; set; }
    public TResult Result { get; set; }

    public Pair() {}
    public Pair(TSource source, TResult result)
    {
        Source = source;
        Result = result;
    }

    // Perhaps override Equals() and GetHashCode() as well
}

언제나 그렇듯이 내장 물건을 사용하여 체중을 측정하는 것이 좋습니다. 일반적으로 그것은 "이 코드를 유지하고 지원해도 괜찮습니까?"라고 스스로에게 묻는 것을 의미합니다. vs. "코드는 내가 필요한 것을 상자 밖으로 나가는가?"

이 경우, 당신은 Tuple<T1, T2>, 나는 단지 다른 개발자들이 쉽게 숨을 쉴 수 있도록 당신 자신의 간단한 것을 씁니다 :)

다른 프로젝트가 있어야하므로 부분적으로 프로젝트를 가질 수 있으며 각 프로젝트에 필요한 클래스 만 설명 할 수 있습니다.

classname.cs public partial className {...}

classname.40.cs public partial classname {public tuple somemethod () {...}}

classname.35.cs public partial classname {public keyvaluepair somemethod () {...}}

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