using System;
using System.Linq;
using System.Collections.Generic;
public class Program
{
public interface ITaggable {}
public struct TagStruct : ITaggable {}
public class TagObject : ITaggable {}
public static IEnumerable<T> DoSomething<T>(IEnumerable<T> input)
where T: ITaggable
{
foreach (var i in input) yield return i;
}
public static void Main(string[] args)
{
var structs = new [] { new TagStruct() };
var objects = new [] { new TagObject() };
Console.WriteLine(DoSomething(structs).First().GetType());
Console.WriteLine(DoSomething(objects).First().GetType());
}
}
dXNpbmcgU3lzdGVtOwp1c2luZyBTeXN0ZW0uTGlucTsKdXNpbmcgU3lzdGVtLkNvbGxlY3Rpb25zLkdlbmVyaWM7CgpwdWJsaWMgY2xhc3MgUHJvZ3JhbQp7CiAgICBwdWJsaWMgaW50ZXJmYWNlIElUYWdnYWJsZSB7fQoKICAgIHB1YmxpYyBzdHJ1Y3QgVGFnU3RydWN0IDogSVRhZ2dhYmxlIHt9CiAgICBwdWJsaWMgY2xhc3MgIFRhZ09iamVjdCA6IElUYWdnYWJsZSB7fQoKICAgIHB1YmxpYyBzdGF0aWMgSUVudW1lcmFibGU8VD4gRG9Tb21ldGhpbmc8VD4oSUVudW1lcmFibGU8VD4gaW5wdXQpIAogICAgICAgIHdoZXJlIFQ6IElUYWdnYWJsZQogICAgewogICAgICAgIGZvcmVhY2ggKHZhciBpIGluIGlucHV0KSB5aWVsZCByZXR1cm4gaTsKICAgIH0KCiAgICBwdWJsaWMgc3RhdGljIHZvaWQgTWFpbihzdHJpbmdbXSBhcmdzKQogICAgewogICAgICAgIHZhciBzdHJ1Y3RzID0gbmV3IFtdIHsgbmV3IFRhZ1N0cnVjdCgpIH07CiAgICAgICAgdmFyIG9iamVjdHMgPSBuZXcgW10geyBuZXcgVGFnT2JqZWN0KCkgfTsKCiAgICAgICAgQ29uc29sZS5Xcml0ZUxpbmUoRG9Tb21ldGhpbmcoc3RydWN0cykuRmlyc3QoKS5HZXRUeXBlKCkpOwogICAgICAgIENvbnNvbGUuV3JpdGVMaW5lKERvU29tZXRoaW5nKG9iamVjdHMpLkZpcnN0KCkuR2V0VHlwZSgpKTsKCgogICAgICAgIAogICAgfQp9Cg==