interface IFoo<in T> { string Bar (T t); } class Foo : IFoo<object> { public string Bar (object t) { return t.GetType ().FullName; } } public class Test { public static int Main () { IFoo<object> foo = new Foo (); IFoo<string> foo2 = foo; if (foo2.Bar ("blah") != typeof (string).FullName) return 1; foo2 = new Foo(); if (foo2.Bar ("blah") != typeof (string).FullName) return 2; return 0; } }