Fordító figyelmeztetés (1. szint) CS1956

A tag "name" a "name" típusú felülettagot "name" (név) valósítja meg. A felülettag futásidőben több egyezést is használ. Implementációtól függ, hogy melyik metódus lesz meghívva.

Ez a figyelmeztetés akkor hozható létre, ha két felületi metódust különböztetünk meg csak attól, hogy egy adott paraméterrel ref van-e megjelölve vagy azzal jelölve out. A legjobb, ha módosítja a kódot, hogy elkerülje ezt a figyelmeztetést, mert nem egyértelmű, vagy nem garantált, hogy melyik metódust hívja meg futásidőben.

Bár a C# különbséget tesz az és refa közöttout, a CLR ugyanazt látja. Amikor eldönti, hogy melyik metódus implementálja az interfészt, a CLR csak kiválaszt egyet.

A figyelmeztetés elkerülése

  1. Adjon módot a fordítónak a metódusok megkülönböztetésére. Megadhat például különböző neveket, vagy megadhat egy további paramétert az egyiken.

Példa

Az alábbi kód a CS1956-ot hozza létre, mivel a két Test metódus Base csak az ref/out első paraméter módosítójának különbségei között különbözik.

// cs1956.cs  
class Base<T, S>  
{  
    // This is the method that should be called.  
    public virtual int Test(out T x) // CS1956  
    {  
        x = default(T);  
        return 0;  
    }  
  
    // This is the "last" method and is the one that ends up being called  
    public virtual int Test(ref S x)  
    {  
        return 1;  
    }  
}  
  
interface IFace  
{  
    int Test(out int x);  
}  
  
class Derived : Base<int, int>, IFace  
{  
    static int Main()  
    {  
        IFace x = new Derived();  
        int y;  
        return x.Test(out y);  
    }  
}