Domanda

Notare il seguente codice.La riga incriminata è stata commentata.

interface I<R> { }

class C : I<int> { }

class Program
{
    private static void function<T, R>(T t) where T : class, I<R>
    {
    }

    static void Main(string[] args)
    {
        // function(new C()); // wont compile
        function<C, int>(new C());
    }
}

Credo che l'inferenza del tipo dovrebbe capire il tipo, perché l'argomento T fornisce il primo tipo, mentre I<R> fornisce il secondo tipo.

C'è un modo per ridisegnare in funzione, in modo che i visitatori non possono avere per specificare i tipi?

È stato utile?

Soluzione

class D : I<int>, I<string> { }
//
function<D, int>(new D());
function<D, string>(new D());
//is R int or string?
function(new D());  

Altri suggerimenti

Non se si desidera mantenere tutti i vincoli.Tuttavia, questo dovrebbe servire altrettanto bene, se non avete un motivo specifico per vietare i tipi di valore:

private static void function<R>(I<R> t)

Ci sono vari modi in cui si potrebbe aggiungere un extra di regole di inferenza di tipo bit di logica che un essere umano può applicare, ma che il compilatore (l'obbedienza la lingua spec) non.

Prima di suggerire che la lingua dovrebbe davvero essere aggiornato per rendere l'inferenza dei tipi di lavoro più flessibile, però, ti suggerisco di leggere la specifica esistente.Se si può capire che sufficientemente facilmente che voi pensate ancora che ne vale la pena anche più complicato, postare una richiesta di funzionalità su Collegare - ma personalmente credo che sia molto complicato già abbastanza.Direi che è molto meglio di quanto non fosse in C# 2.0.

A presentare la tesi opposta, tuttavia in diverse lingue (in particolare quelli funzionali) sono più potenti di inferenza del tipo di meccanismi.Ci sono sempre pro e contro qui - credo che uno dei vantaggi dell'attuale sistema di inferenza in C# è che si fa sempre in corso o si ferma, per esempio - Eric Lippert blog dispone di ulteriori informazioni su questo e un numero di altro tipo di inferenza problemi.

No, C# non supporta questo tipo di inferenza.

Utilizzare direttamente l'interfaccia e cercare il tipo con tipo..

private static void function<R>(I<R> t)
{
   Type typeofT = typeof(T);
}

non può fare di meglio.

Se avete bisogno di chiamare un altro metodo generico T, si può costruire una generica chiamata attraverso la riflessione utilizzando typeofT Tipo.

C# non supporta questo tipo di inferenza di tipo.Prendere in considerazione questo caso, che aggiunge un po ' di ambiguità per il problema.

class Other : I<int>, I<Student>{ ... }
void Example(){
  function(new D());
}

In questo caso c'è un'ambiguità che dovrebbe essere scelto.

Se si guarda avanti per C# 4.0 il problema aumenta solo con il nuovo varianza caratteristiche di cui si sta aggiungendo.

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top