Muhtemelen uyarı CS1690, üreme kodu bahsediyoruz:
public class Remotable : MarshalByRefObject {
public int field;
}
public class Test {
public static void Run() {
var obj = new Remotable();
// Warning CS1690:
Console.WriteLine(obj.field.ToString());
}
}
bir uzak senaryoda, Test.Run yöntemi Kumandalı nesnenin bir proxy ile çalışacaktır. Bir özellik, yöntem veya olay için bir vekil oluşturma, bir çok sorun değildir, sadece ikame içeren bir MethodTable oluşturma sorunu. Alanlar sorun olsa da, 'kanca' için bir şey yok. Bir MBRO için, JIT derleyicisi artık alana doğrudan erişmek için kod üretmez, bu durumda CLR, JIT_GetField32() içine yerleştirilmiş bir yardımcı yönteme çağrı gönderir.
Bu yardımcı, nesnenin bir proxy olup olmadığını kontrol eder ve eğer durum buysa, uzak değeri elde etmek için uzaktaki sıhhi tesisat sistemini kullanır. Ya da değilse doğrudan alana erişir. ToString() çağrısı yapmak, ancak kutunun değerini gerektirir. Bu bir sorun, boks proxy'den değeri ayırır. Kutulu değerin, her zaman, uzak bir değerin doğru bir kopyasının olduğundan emin olmanın hiçbir yolu yoktur. ToString() yöntemi dizgiyi biçimlendirmek için değeri kullanmıyorsa, JIT_GetField32() öğesini tekrar çağırmak mümkün değildir.
CS1690 için geçici çözüm, alanı bir özellik ile sarmanın ötesinde basittir, sadece alan değerini yerel bir değişkene kopyalamanız yeterlidir. Şimdi, kodun bir kopya ile çalıştığı ve hiçbir zaman bir sürpriz olmadığından, derleyicinin bir uyarı vermesi gerekmediği açıktır. hans-passant @ gelen öneri yanısıra
public static void Run() {
var obj = new Remotable();
var value = obj.field;
Console.WriteLine(value.ToString()); // No warning
}
Bu uyarıyı aldığınız bağlam nedir? –