সাবধানবাণী জন্য কারণ বিভাগে ব্যাখ্যা করা হয় The issue with T?
এর বাইরে Nullable রেফারেন্স প্রকারভেদ চেষ্টা । দীর্ঘ গল্প সংক্ষিপ্ত, আপনি যদি ব্যবহার করেন তবে আপনাকে T?
টাইপটি শ্রেণি বা কাঠামো কিনা তা নির্দিষ্ট করতে হবে। আপনি প্রতিটি ক্ষেত্রে দুটি ধরণের তৈরি শেষ করতে পারেন।
গভীর সমস্যাটি হ'ল রেজাল্ট বাস্তবায়ন করতে এবং সাফল্য এবং ত্রুটি উভয় মান উভয়কে ধরে রাখতে এক ধরণের ব্যবহারের ফলে রেজাল্টটি ঠিক করার মতো সমস্যা এবং আরও কয়েকটি সমস্যা ফিরে আসে।
- একই ধরণের চারপাশে একটি নির্ধারিত মান বহন করতে হয়, হয় প্রকারটি বা ত্রুটি, বা শূন্যস্থান ফিরিয়ে আনতে হবে
- ধরণের সাথে প্যাটার্নের মিল পাওয়া সম্ভব নয়। এটি কাজ করতে আপনাকে কিছু অভিনব অবস্থানীয় প্যাটার্নের সাথে মিলের অভিব্যক্তি ব্যবহার করতে হবে।
- নালগুলি এড়ানোর জন্য আপনাকে এফ # এর বিকল্পগুলির মতো অপশন / হতে পারে এর মতো কিছু ব্যবহার করতে হবে । আপনি এখনও মান বা ত্রুটির জন্য যদিও কোনও আশেপাশে কিছু রাখবেন না।
এফ # তে ফলাফল (এবং হয়)
প্রারম্ভিক পয়েন্টটি এফ # এর ফলাফলের ধরণের এবং বৈষম্যমূলক ইউনিয়ন হওয়া উচিত । সর্বোপরি, এটি ইতিমধ্যে .NET এ কাজ করে।
F # এ ফলাফলের ধরণটি হ'ল:
type Result<'T,'TError> =
| Ok of ResultValue:'T
| Error of ErrorValue:'TError
প্রকারগুলি নিজেরাই কেবল যা প্রয়োজন তা বহন করে।
এফ # এর Uাবিগুলি শূন্যের প্রয়োজন ছাড়াই নিখুঁত প্যাটার্ন মেলানোর অনুমতি দেয়:
match res2 with
| Ok req -> printfn "My request was valid! Name: %s Email %s" req.Name req.Email
| Error e -> printfn "Error: %s" e
এটি সি # 8 এ অনুকরণ করে
দুর্ভাগ্যক্রমে, সি # 8 এর এখনও Dাবি নেই, সেগুলি সি # 9 এর জন্য নির্ধারিত হয়েছে সি সি 8-তে আমরা এটি অনুকরণ করতে পারি, তবে আমরা সম্পূর্ণ মিল খুঁজে পাই:
#nullable enable
public interface IResult<TResult,TError>{}
struct Success<TResult,TError> : IResult<TResult,TError>
{
public TResult Value {get;}
public Success(TResult value)=>Value=value;
public void Deconstruct(out TResult value)=>value=Value;
}
struct Error<TResult,TError> : IResult<TResult,TError>
{
public TError ErrorValue {get;}
public Error(TError error)=>ErrorValue=error;
public void Deconstruct(out TError error)=>error=ErrorValue;
}
এবং এটি ব্যবহার করুন:
IResult<double,string> Sqrt(IResult<double,string> input)
{
return input switch {
Error<double,string> e => e,
Success<double,string> (var v) when v<0 => new Error<double,string>("Negative"),
Success<double,string> (var v) => new Success<double,string>(Math.Sqrt(v)),
_ => throw new ArgumentException()
};
}
সম্পূর্ণ প্যাটার্ন মেলানো ছাড়াই সংকলক সতর্কতা এড়ানোর জন্য আমাদের সেই ডিফল্ট ধারাটি যুক্ত করতে হবে।
আমি এখনও মৃত মূল্যবোধগুলি প্রবর্তন না করে পুরোপুরি ম্যাচিংয়ের একটি উপায় খুঁজছি , যদিও সেগুলি কেবল একটি বিকল্প are
অপশন / হয়তো
বিস্তৃত মেলানো ব্যবহার করে এমন একটি বিকল্প ক্লাস তৈরি করা সহজ:
readonly struct Option<T>
{
public readonly T Value {get;}
public readonly bool IsSome {get;}
public readonly bool IsNone =>!IsSome;
public Option(T value)=>(Value,IsSome)=(value,true);
public void Deconstruct(out T value,out bool isSome)=>(value,isSome)=(Value,IsSome);
}
//Convenience methods, similar to F#'s Option module
static class Option
{
public static Option<T> Some<T>(T value)=>new Option<T>(value);
public static Option<T> None<T>()=>default;
}
যা এর সাথে ব্যবহার করা যেতে পারে:
string cateGory = someValue switch { Option<Category> (_ ,false) =>"No Category",
Option<Category> (var v,true) => v.Name
};