2016-04-12 30 views
1

Bir kısıtlama türüne bir eylem yapmaya çalışıyorum. Neden C# onu atamaz? Ben dönüşünü döküm zorlarsanızNeden C#, bir eylemi dolaylı olarak yapamaz?</ A0> eylemi <T> Burada T: BaseType eylemi <BaseType>

private Action<BaseObject> MyAction { get; set; } 

//Cannot implicitly cast 
internal void SetMyAction<TModel>(Action<TModel> action) where TModel : BaseObject 
{ 
    MyAction = action; 
} 

//MyAction return null 
internal void SetMyAction<TModel>(Action<TModel> action) where TModel : BaseObject 
{ 
    MyAction = (Action<TModel>)action; 
} 

cevap

3

Her Action<TModel> bir Action<BaseObject> olan boş. Şimdi somut bir örneğe bakalım: Action<string> ve Action<object>.

Bir Action<object> temsilci, parametre olarak object referansını alabilir. action(new object()) yazmak için kesinlikle geçerlidir.

Şimdi bir Action<string> düşünün - bu sadecestring referansı alabilir. Görünüşe göre aşağıdaki kodun derlenmesini bekliyorsunuz - yürütme süresinde nasıl davranmasını beklersiniz?

Action<string> printLength = text => Console.WriteLine(text.Length); 
Action<object> action = printLength; // This isn't actually valid 
action(new object()); 

Temelde, Action<T>T içinde kontravaryant değil eşdeğişkin olduğunu. Yani, , Action<object>'dan Action<string>'a örtük bir dönüşümdür, ancak bunun tersi de doğru değildir.

senin özel durumuna, ben hayal uygulamak:

Action<DerivedObject1> x = do1 => Console.WriteLine(do1.SomeProperty); 
SetMyAction<DerivedObject1>(x); 

// Presumably there's *something* to invoke the action... 
InvokeMyAction(new DerivedObject2()); 

Ne olmasını beklersiniz?