使用父参数化类型将对象分配给父类型

时间:2015-08-29 17:51:48

标签: c# generics

以下是示例代码:

public interface C1 { }
public class C2 : C1 { }

public interface MK<T> { }

public struct MKSub : MK<C2> { }

public class Test
{
    void Something()
    {
        MK<C1> test = new MKSub(); // Somehow make it so this will work?
    }
}

是否有某种方法可以修改它,以便注释行上的赋值可以工作?

如果参数化类型不是MK test = new MKSub();,那么当然可以。但是,是否可以对泛型类型声明或其他东西进行某些操作以使上述赋值也起作用?

2 个答案:

答案 0 :(得分:2)

您可以在界面MK上使用协方差运算符public interface C1 { } public class C2 : C1 { } public interface MK<out T> { } // use <out T> instead of <T> public struct MKSub : MK<C2> { } public class Test { void Something() { MK<C1> test = new MKSub(); // this compiles } }

  
  
$(document).ready(function() {
        function close_accordion_section() {
            $('.accordion .accordion-section-title').removeClass('active');
    		
            $('.accordion .accordion-section-content').slideUp(300).removeClass('open');
        }
     
        $('.accordion-section-title').click(function(e) {
            // Grab current anchor value
            var currentAttrValue = $(this).attr('href');
     
            if($(e.target).is('.active')) {
                close_accordion_section();
            }else {
                close_accordion_section();
     
                // Add active class to section title
                $(this).addClass('active');
                // Open up the hidden content panel
                $('.accordion ' + currentAttrValue).slideDown(300).addClass('open'); 
            }
     
            e.preventDefault();
        });
    });
    
    

协方差和逆变是泛型是在这个答案中解释的太大的主题,但你可以阅读更多关于它on MSDN

答案 1 :(得分:0)

只有当您的界面MK仅将T用作任何方法的输出时,才能执行此操作,并且永远不会作为输入。然后你可以这样做:

public interface MK<out T> {
    T MakeT<Q>(Q other) where Q : T;
}

但是,如果你尝试这样做

public interface MK<out T> {
    void ConsumeT(T val);
}

您将收到编译时错误:

  

协变类型参数T必须在Test.MK<T>.ConsumeT(T)

上违反有效