using System;
public class Test
{
public static void Main()
{
var sta = new SomeType<A>();
sta.Do(new A());
}
}
public class SomeType<T> where T : Z
{
public void Do(T t)
{
t.Foo();
t.Bar();
}
}
public interface X { void Foo(); }
public interface Y { void Bar(); }
public interface Z : X, Y { }
public class A : Z
{
public void Foo() {}
public void Bar() {}
}
public class B : Z
{
public void Foo() {}
public void Bar() {}
}
dXNpbmcgU3lzdGVtOwoKcHVibGljIGNsYXNzIFRlc3QKewoJcHVibGljIHN0YXRpYyB2b2lkIE1haW4oKQoJewoJCXZhciBzdGEgPSBuZXcgU29tZVR5cGU8QT4oKTsKCQlzdGEuRG8obmV3IEEoKSk7Cgl9Cn0KCnB1YmxpYyBjbGFzcyBTb21lVHlwZTxUPiB3aGVyZSBUIDogWgp7CglwdWJsaWMgdm9pZCBEbyhUIHQpCgl7CgkJdC5Gb28oKTsKCQl0LkJhcigpOwoJfQp9CgpwdWJsaWMgaW50ZXJmYWNlIFggeyB2b2lkIEZvbygpOyB9CiAgICAKcHVibGljIGludGVyZmFjZSBZIHsgdm9pZCBCYXIoKTsgfQoKcHVibGljIGludGVyZmFjZSBaIDogWCwgWSB7IH0KCnB1YmxpYyBjbGFzcyBBIDogWgp7CiAgICBwdWJsaWMgdm9pZCBGb28oKSB7fQogICAgcHVibGljIHZvaWQgQmFyKCkge30KfQoKcHVibGljIGNsYXNzIEIgOiBaCnsKICAgIHB1YmxpYyB2b2lkIEZvbygpIHt9CiAgICBwdWJsaWMgdm9pZCBCYXIoKSB7fQp9