In che modo i metodi CLS compatibili hanno variabili locali non conformi?

3

.NET CLS ( Specifica lingua comune ) consente a un programmatore di scrivere codice in un linguaggio .NET e sa con certezza che tutti gli altri linguaggi .NET possono interagire in sicurezza e persino utilizzare dati e metodi da il progetto originale.

In Troelsen e Japikse's, C # 6.0 e .NET 4.6 Framework , gli autori scrivono che non puoi avere Parametri CLS non conformi o valori di ritorno per un metodo, ma è possibile avere variabili CLS non interne un metodo, tuttavia il metodo è ancora conforme a CLS.

Ad esempio (pagina 19),

class Calc
{
   // Exposed unsigned data is not CLS compliant!
   public ulong Add(ulong x, ulong y)
   {
      return x + y;
   }
}

non è compatibile con CLS a causa dei parametri ulong . Ma (pagina 20),

If you were to only make use of unsigned data internally in a method, as follows:

class Calc
{
   public int Add(int x, int y)
   {
      // As this ulong variable is only used internally,
      // we are still CLS compliant.
      ulong temp = 0;
      ...
      return x + y;
   }
}

you have still conformed to the rules of the CLS and can rest assured that all .NET languages are able to invoke the Add() method.

Quello che non capisco è che cosa succede se la variabile non conforme CLS interagisce con uno dei parametri che viene restituito nel risultato del metodo? Questo non romperebbe la non conformità?

Grazie.

La mia intuizione è che per questo esempio, l'unica cosa che "spezzerebbe" la conformità del tipo CLS int sarebbe se un operatore matematico causasse un overflow w / la variabile int - che sarebbe quindi un problema durante la compilazione o il runtime, non con la conformità del CLS.

    
posta 8protons 25.01.2017 - 08:09
fonte

1 risposta

4

La funzione CLS compatibile potrebbe essere stata scritta come

class Calc
{
   public int Add(int x, int y)
   {
      ulong temp_x = x;
      ulong temp_y = y;

      // Perform calculation using unsigned math
      ulong temp_result = temp_x + temp_y;
      // Convert back to signed int for CLS compliance
      return (int)temp_result;
   }
}

Il motivo per cui una funzione conforme a CLS non può utilizzare ulong è perché non tutti i linguaggi .NET hanno tipi non firmati e quelle lingue non potrebbero chiamare Add(ulong, ulong) o interpretare un valore di ritorno senza segno.

L'uso di tipi che non sono universalmente supportati dai linguaggi .NET all'interno delle tue funzioni è completamente gratuito e dipende solo dalle funzionalità della lingua in cui stai scrivendo il codice. Altre lingue non vedono il codice all'interno delle funzioni, quindi non importa se quel codice utilizza funzionalità che non sono universalmente supportate.

    
risposta data 25.01.2017 - 08:56
fonte

Leggi altre domande sui tag