지 않는 이유는 무엇 C#지원 묵시적 일반적인 형태에서 클래스 생성자?

StackOverflow https://stackoverflow.com/questions/45604

  •  09-06-2019
  •  | 
  •  

문제

C#할 필요가 없을 지정하는 일반적인 유형을 매개 변수는 경우 컴파일러를 추정할 수 있고,그것은,예를 들어:

List<int> myInts = new List<int> {0,1,1,
    2,3,5,8,13,21,34,55,89,144,233,377,
    610,987,1597,2584,4181,6765};

//this statement is clunky
List<string> myStrings = myInts.
    Select<int,string>( i => i.ToString() ).
    ToList<string>();

//the type is inferred from the lambda expression
//the compiler knows that it's taking an int and 
//returning a string
List<string> myStrings = myInts.
    Select( i => i.ToString() ).
    ToList();

이것은 필요한 익명의 종류는 당신이 무엇인지 모르 형식을 매개 변수(intellisense 에서 그것으로 보여줍 'a)기 때문에 추가하여 컴파일러입니다.

클래스 수준 입력 매개변수는 당신을 실망시키지 않는다:

//sample generic class
public class GenericDemo<T> 
{
    public GenericDemo ( T value ) 
    {
        GenericTypedProperty = value;
    }

    public T GenericTypedProperty {get; set;}
}

//why can't I do:
int anIntValue = 4181;
var item = new GenericDemo( anIntValue ); //type inference fails

//however I can create a wrapper like this:
public static GenericDemo<T> Create<T> ( T value )
{
    return new GenericDemo<T> ( value );
}

//then this works - type inference on the method compiles
var item = Create( anIntValue );

지 않는 이유는 무엇 C#지원이스 레벨은 일반 형식추?

도움이 되었습니까?

해결책

실제로,당신의 질문에 나쁘지 않다.나는 가지고 놀고 일반적인 프로그래밍 언어를 지난 몇 년 동안이 있지만 나는 결코 주변에 오면 실제로 그것을 개발하는(아마도 결코),많이 생각했에 대한 일반적인 유형을 추정하고 하나의 최고 우선 순위는 항상 건설을 허용 클래스를 지정하지 않고 일반적인 유형입니다.

C#단순히 부족의 규칙을 확인이 가능합니다.내가 생각하는 개발자들을 보지 못하는 neccesity 을 포함한다.실제로,다음 코드는 것이 매우 근처의 제안서 문제를 해결합니다.모든 C#요구되는 구문을 지원합니다.

class Foo<T> {
    public Foo(T x) { … }
}

// Notice: non-generic class overload. Possible in C#!
class Foo {
    public static Foo<T> ctor<T>(T x) { return new Foo<T>(x); }
}

var x = Foo.ctor(42);

이 코드를 실제로,우리는 다음과 같 문제가 아니라 하나의 의미는 단순히 하나의 부족을 지원합니다.내가 다 이전 게시합니다.;-)

다른 팁

지 않는 이유는 무엇 C#지원이스 레벨은 일반 형식추?

기 때문에 그들은 일반적으로 불명확하다.대조적으로 유추한 기능을 위한 통화(는 경우 모든 유형 표시에서 인수).그러나의 경우에 생성자를 호출(영광 기능을 위해서 토론),컴파일러가를 해결하는 여러 수준에서 동일한 시간입니다.하나의 수준 클래스 수준이고 다른 생성자를 인수는 수준입니다.내가 믿는 이 해결하는 알고리즘 비록 하는 것입니다.직관적으로 말할 것도 NP-complete.

을 설명하기 위해 극단적인 경우는 해결이 불가능한 상상,다음과 같은 클래스고 무엇을 말해 컴파일러가야 하:

class Foo<T> {
    public Foo<U>(U x) { }
}

var x = new Foo(1);

덕분에 콘라드는 좋은 반응(+1)지만,단지 그것에 확장.

자는 척 C#은 명시적인 생성자 기능:

//your example
var x = new Foo( 1 );

//becomes
var x = Foo.ctor( 1 );

//your problem is valid because this would be
var x = Foo<T>.ctor<int>( 1 );
//and T can't be inferred

당신은 매우는 첫 번째 생성자 될 수 없는 유추됩니다.

지금은 돌아가자는 클래스

class Foo<T> 
{
    //<T> can't mean anything else in this context
    public Foo(T x) { }
}

//this would now throw an exception unless the
//typeparam matches the parameter
var x = Foo<int>.ctor( 1 );

//so why wouldn't this work?
var x = Foo.ctor( 1 );

물론 추가했을 경우에 당신의 생성자 뒤에는(그것의 다른 유형)우리는 모호한 통화 정확히 같다면 정상적인 방법은 하중 초과할 수 없었는 해결 될 수 있습니다.

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