Please do not reply to this email- if you want to comment on the bug, go to the URL shown below and enter your comments there.
Changed by [EMAIL PROTECTED] http://bugzilla.ximian.com/show_bug.cgi?id=79010 --- shadow/79010 2006-08-04 05:08:42.000000000 -0400 +++ shadow/79010.tmp.13977 2006-08-04 05:08:42.000000000 -0400 @@ -0,0 +1,138 @@ +Bug#: 79010 +Product: Mono: Runtime +Version: 1.1 +OS: +OS Details: Debian sarge +Status: NEW +Resolution: +Severity: +Priority: Normal +Component: JIT +AssignedTo: [EMAIL PROTECTED] +ReportedBy: [EMAIL PROTECTED] +QAContact: [EMAIL PROTECTED] +TargetMilestone: --- +URL: +Cc: +Summary: Problem with using a generic function from an interface implemented by structure + +Description of Problem: +I got NullReferenceException though the referred object I used was not null. +The problem happens only with a generic function and only if the interface +is implemented by a structure. The problem happens only with Mono runtime +and the same exe file works fine with Microsoft runtime on Windows. + +Steps to reproduce the problem: +The following code snippet demonstrates the problem: + +=== +using System; +using System.Diagnostics; + +public interface IMyInStream +{ + byte Get(); +} + +public class MyInStream : IMyInStream +{ + public MyInStream() { } + public byte Get() { return 0; } +} + +public interface IMyHandler +{ + void Foo(out int v); + void Bar<T>(out T v); +} + +struct Handler : IMyHandler +{ + Test t; + + public Handler(Test test) + { + t = test; + } + + // This works + public void Foo(out int v) + { + t.GetByte(); + v = 0; + } + // and this one does not + // the only difference between these two functions is + // that the later is generic + public void Bar<T>(out T v) + { + t.GetByte(); + v = default(T); + } +} + +public class Test +{ + + public byte GetByte() + { + // A strange thing happens here when it is called from Bar<T> + // stream is not null and even GetType() returns something for it + Debug.Assert(stream != null); + Type t = stream.GetType(); + Debug.Assert(t != null); + // however, attempt to call t.ToString() causes NullReferenceException + // string s = t.ToString(); + // as well as attempt to get a byte from the stream + return stream.Get(); + } + + // it is important to have interface, not MyInStream + IMyInStream stream; + + public Test() + { + stream = new MyInStream(); + } + + // it is important to pass interface, not MyHandler itself + private static void Do(IMyHandler h) + { + int value; + h.Foo(out value); + Console.WriteLine("value={0}", value); + h.Bar(out value); + Console.WriteLine("value={0}", value); + } + public static void Main() + { + Test test = new Test(); + Handler handler = new Handler(test); + Do(handler); + } +} +=== + +Actual Results: +value=0 + +Unhandled Exception: System.NullReferenceException: Object reference not +set to an instance of an object +in [0x00012] (at /home/dpotapov/cimetrics/bacnet/bacstac.net/bug1.cs:60) +Test:GetByte () +in <0x00019> Handler:Bar[Int32] (System.Int32 v) +in [0x0001b] (at /home/dpotapov/cimetrics/bacnet/bacstac.net/bug1.cs:77) +Test:Do (IMyHandler h) +in [0x00014] (at /home/dpotapov/cimetrics/bacnet/bacstac.net/bug1.cs:84) +Test:Main () + + +Expected Results: +value=0 +value=0 + +How often does this happen? +Always + +Additional Information: +I use Mono 1.1.13.8 installed by Linux Installer for x86 _______________________________________________ mono-bugs maillist - [email protected] http://lists.ximian.com/mailman/listinfo/mono-bugs
