سؤال

وأريد أن أكتب تعبير لامدا ضمن مضمنة إذا البيان. ولكن إذا مضمنة يجب أن يكون بيان النتائج نوع قوية.

MyType obj = someObj.IsOk ? null : () => {
   MyType o = new MyType(intVal);
   o.PropertyName = false;
   return o;
};

وبالطبع هذا لا يعمل، لأن التعبير امدا لا كتبته بقوة. فكرت في استخدام Func<intVal, MyType> مندوب، لجعله نوع قوي.

ولكن كيف يمكنني استخدام هذا Func<> داخل مضمنة إذا؟ هل من الممكن على الإطلاق من شأنه أن لدي لتحديد وظيفة خارج بلدي واستخدامه في مضمنة إذا البيان؟

هل كانت مفيدة؟

المحلول

وحتى مع رمز أكثر تعقيدا، يمكنك استخدام تعبير كائن مهيئ:

MyType obj = someObj.IsOk ? null : new MyType(intVal) { ProName = false };

إذا <م> حقا ترغب في استخدام امدا رغم ذلك، يمكن أن تكتب:

MyType obj = someObj.IsOk ? null : ((Func<MyType>) (() => {
   MyType o = new MyType(intVal);
   o.ProName = false;
   return o;
}))();

ولكن، وهذا هو بصراحة <م> كابوس الأقواس ويلقي. يمكنك جعله أكثر بساطة مع أسلوب مساعد:

public T Execute(Func<T> func)
{
    return func();
}

...

MyType obj = someObj.IsOk ? null : Execute(() => {
   MyType o = new MyType(intVal);
   o.ProName = false;
   return o;
});

نصائح أخرى

وعليها أن تفعل مع الكتابة امدا هنا شيئا. تحاول العودة إما null أو (وظيفة يأخذ بدون وسائط وإرجاع MyType) ولكن كنت أقول المترجم أن نتيجة ذلك البيان ليست وظيفة، ولكن مجرد MyType. أعتقد أن ما تريد القيام به هو

MyType obj = someObj.IsOk ? null : new MyType(intVal);

إذا كان لديك شيء من هذا القبيل ...

  var obj = (someObj.IsOK) ? null : () => {
             return new MyType(intVal) { PropName =false }; }

وسوف تحصل على خطأ ...

<اقتباس فقرة>   

و"لا يوجد تحويل صريح   بين لاغية والتعبير امدا ".

ويتم مناقشتها والسبب في ذلك في هذه خيط SO .

ومارك هو الصحيح على ما نحاول القيام به مع نموذج التعليمات البرمجية، باستثناء يمكنك تعيين الخاصية في مثل كذلك مثل هذا ...

var obj = someObj.IsOk ? null : new MyType(intVal) { PropName = false };
مرخصة بموجب: CC-BY-SA مع الإسناد
لا تنتمي إلى StackOverflow
scroll top