2011-11-05 6 views
9

Quel est le problème avec le code suivant? Je ne peux pas voir la raison de l'erreur mentionnée ci-dessous. J'utilise Mono, cela pourrait-il être un bug dans Mono, et compilera-t-il sans erreurs dans VStudio?Pas de conversion de type boxe ou type pour le paramètre Type générique avec Mono

public static class ClientFactory { 
    public static T CreateClient<T, I>() 
    /* error here */ 
    where T : ClientBase<I>, I 
    where I : class { 
    return CreateClient<T, I>(null, null); 
    } 

    public static T CreateClient<T, I>(string endpointConfigurationName) 
    /* error here */ 
    where T : ClientBase<I>, I 
    where I : class { 
    return CreateClient<T, I>(endpointConfigurationName, null); 
    } 

    public static T CreateClient<T, I>(string endpointConfigurationName, string remoteAddress) 
    /* error here */ 
    where T : ClientBase<I>, I 
    where I : class { 
    return CreateClient<T, I>(endpointConfigurationName, remoteAddress, Settings.Default.UserName, Settings.Default.Password); 
    } 

    public static T CreateClient<T, I>(string endpointConfigurationName, string remoteAddress, string userName, string password) 
    /* NO error here, this method compiles fine */ 
    where T : ClientBase<I>, I 
    where I : class { 

    T client; 

    /* get client instance */ 
    /* do stuff with it */ 

    return client; 
    } 
} 

Je reçois l'erreur de compilation:

…/ClientFactory.cs(14,14): Error CS0314: The type `T' cannot be used as type parameter `T' in the generic type or method `….ClientFactory.CreateClient(string, string)'. There is no boxing or type parameter conversion from `T' to `System.ServiceModel.ClientBase' (CS0314)

+1

Je copiais votre code à un nouveau VC# 2010 projet, a changé '/ * faire des choses * /' à 'client = par défaut (T); 'et remplacé les deux paramètres par' "" '. Compile bien, aucune erreur de compilation. – dtb

+0

Serait-ce un bug dans Mono? – knittl

+0

Quelle version de 'dmcs' utilisez-vous? – dtb

Répondre

2

TL; DR il est susceptible d'être un bug dans votre version: il compile parfaitement sur ma version de Mono.


Le code suivant compile parfaitement:

using System; 

namespace so_test 
{ 

    public class ClientBase<T> { 
     // whatever 
    } 

    public static class Settings { 
     public static SettingValues Default; 
    } 

    public class SettingValues { 
     public string UserName; 
     public string Password; 
    } 

    public static class ClientFactory { 
     public static T CreateClient<T, I>() 
     /* error here */ 
     where T : ClientBase<I>, I 
     where I : class { 
      return CreateClient<T, I>(null, null); 
     } 

     public static T CreateClient<T, I>(string endpointConfigurationName) 
     /* error here */ 
     where T : ClientBase<I>, I 
     where I : class { 
      return CreateClient<T, I>(endpointConfigurationName, null); 
     } 

     public static T CreateClient<T, I>(string endpointConfigurationName, string remoteAddress) 
     /* error here */ 
     where T : ClientBase<I>, I 
     where I : class { 
      return CreateClient<T, I>(endpointConfigurationName, remoteAddress, Settings.Default.UserName, Settings.Default.Password); 
     } 

     public static T CreateClient<T, I>(string endpointConfigurationName, string remoteAddress, string userName, string password) 
     /* NO error here, this method compiles fine */ 
     where T : ClientBase<I>, I 
     where I : class { 

      T client = default(T); 

      /* get client instance */ 
      /* do stuff with it */ 

      return client; 
     } 
    } 
} 

imac:~ sklivvz$ mono -V 
Mono JIT compiler version 2.10.6 (tarball Fri Sep 16 00:13:06 EDT 2011) 
Copyright (C) 2002-2011 Novell, Inc, Xamarin, Inc and Contributors. www.mono-project.com 
    TLS:   normal 
    SIGSEGV:  normal 
    Notification: kqueue 
    Architecture: x86 
    Disabled:  none 
    Misc:   debugger softdebug 
    LLVM:   yes(2.9svn-mono) 
    GC:   Included Boehm (with typed GC) 
+1

C'était en effet un bug en mono. Il a été introduit dans [commit 'bf9a580867'] (https://github.com/mono/mono/commit/bf9a580867cd573a398ed5c3ea5668c57e5b9b9b) et corrigé dans [commit' 8f96710cc'] (https://github.com/mono/mono/commit/8f96710cca52860c47144592b9c82ea2fc4198b7) – knittl

Questions connexes