[Mono-bugs] [Bug 635720] New: gmcs fails to compile nested classes with generics

bugzilla_noreply at novell.com bugzilla_noreply at novell.com
Tue Aug 31 00:28:50 EDT 2010


https://bugzilla.novell.com/show_bug.cgi?id=635720

https://bugzilla.novell.com/show_bug.cgi?id=635720#c0


           Summary: gmcs fails to compile nested classes with generics
    Classification: Mono
           Product: Mono: Compilers
           Version: 2.6.x
          Platform: x86
        OS/Version: Windows 7
            Status: NEW
          Severity: Normal
          Priority: P5 - None
         Component: C#
        AssignedTo: mono-bugs at lists.ximian.com
        ReportedBy: joe at mistachkin.com
         QAContact: mono-bugs at lists.ximian.com
          Found By: ---
           Blocker: ---


User-Agent:       Mozilla/5.0 (Windows; U; Windows NT 6.1; en-US; rv:1.9.2.8)
Gecko/20100722 Firefox/3.6.8

using System;
using System.Collections.Generic;

namespace ConsoleApplication1
{
    static class Program
    {
        static void Main(string[] args)
        {
            //
            // NOTE: This code probably doesn't really matter.
            //
            Dictionary<string, string> dictionary = new Dictionary<string,
string>();

            dictionary.Add("foo", "foo");
            dictionary.Add("bar", "bar");

            Console.WriteLine(OuterGeneric<string>.Equals("test", "test"));
            Console.WriteLine(Nothing1.InnerGeneric<string>.Equals("test",
"test"));

            string key = null;

            if (OuterGeneric<string, string>.TryGetKeyAtIndex(dictionary, 0,
ref key))
                Console.WriteLine(key);

            if (Nothing2.InnerGeneric<string,
string>.TryGetKeyAtIndex(dictionary, 0, ref key))
                Console.WriteLine(key);

            Console.ReadKey();
        }
    }

    ///////////////////////////////////////////////////////////////////////////

    public static class OuterGeneric<T>
    {
        public static bool Equals(
            T x,
            T y
            )
        {
            if ((x != null) && (y != null))
                return x.Equals(y);
            else
                return (x == null) && (y == null);
        }
    }

    ///////////////////////////////////////////////////////////////////////////

    public static class OuterGeneric<T1, T2>
    {
        public static bool TryGetKeyAtIndex(
            IDictionary<T1, T2> dictionary,
            int index,
            ref T1 key
            )
        {
            bool result = false;

            if (dictionary != null)
            {
                List<T1> keys = new List<T1>(dictionary.Keys);

                if (keys != null)
                {
                    if ((index >= 0) && (index < keys.Count))
                    {
                        key = keys[index];
                        result = true;
                    }
                }
            }

            return result;
        }
    }

    ///////////////////////////////////////////////////////////////////////////

    public static class Nothing1
    {
        public static class InnerGeneric<T>
        {
            public static bool Equals(
                T x,
                T y
                )
            {
                if ((x != null) && (y != null))
                    return x.Equals(y);
                else
                    return (x == null) && (y == null);
            }
        }
    }

    ///////////////////////////////////////////////////////////////////////////

    public static class Nothing2
    {
        public static class InnerGeneric<T1, T2>
        {
            public static bool TryGetKeyAtIndex(
                IDictionary<T1, T2> dictionary,
                int index,
                ref T1 key
                )
            {
                bool result = false;

                if (dictionary != null)
                {
                    List<T1> keys = new List<T1>(dictionary.Keys);

                    if (keys != null)
                    {
                        if ((index >= 0) && (index < keys.Count))
                        {
                            key = keys[index];
                            result = true;
                        }
                    }
                }

                return result;
            }
        }
    }
}

// end of file


Reproducible: Always

Steps to Reproduce:
1. Compile and run the code above.
2. The code fails to compile with an error message.

Actual Results:  
Fails to compile the code producing the following error messages:

Program.cs(27,55): error CS1502: The best overloaded method match for
`ConsoleApplication1.Nothing2.InnerGeneric<T1,T2>.TryGetKeyAtIndex(System.Collections.Generic.IDictionary<T1,T2>,
int, ref T1)' has some invalid arguments
Program.cs(105,32): (Location of the symbol related to previous error)
Program.cs(27,55): error CS1503: Argument `#1' cannot convert
`System.Collections.Generic.Dictionary<string,string>' expression to type
`System.Collections.Generic.IDictionary<T1,T2>'
Compilation failed: 2 error(s), 0 warnings


Expected Results:  
The code should successfully compile and when run output the following:

True
True
foo
foo

-- 
Configure bugmail: https://bugzilla.novell.com/userprefs.cgi?tab=email
------- You are receiving this mail because: -------
You are the QA contact for the bug.
You are the assignee for the bug.


More information about the mono-bugs mailing list