全面实施https://gist.github.com/1306491 我正在使用带隐式转换的struct来隐式转换为源类型和从源类型转换,并通过结构的泛型参数描述检查规则。 从我的角度来看,它可以减少代码重复,并可以作为dsl读取。
使用方法:
static void Main(string[] args)
{
string s = Size(null);//result: argument exception
Console.WriteLine(Lenght(null));//result 0
DivByZero(0);// result: argument exception
Log(5);//result: log 5 to console
AddTenSymbols("");//result: if result string has lenght more than 10 then log result string/
Console.ReadKey();
}
static Check<string, IsNotNull<string>> Size(Check<object, IsNotNull<object>> obj)
{
return obj.ToString();
}
static int Lenght(Check<string, AndReplaceByEmptyIfNull> str)
{
string stri = str;
return stri.Length;
//return ((string)str).Length;
}
static int DivByZero(Check<int, If<int, EqualsTo<Zero>, ThenThrowArgumentException<int>>> i)
{
return 1 / i;
}
static Check<int, If<int, BothTrue<Not<EqualsTo<Zero>>, Not<MoreThan<Ten>>>, ThenLog<int>>> Log(int i)
{
return i;
}
static Check<string, If<string, Member<string, int, StringLenght, MoreThan<Ten>>, ThenLog<string>>> AddTenSymbols(string s)
{
return s + "asffgsdfgd"; ;
}
答案 0 :(得分:2)
回答标题问题:不,不要这样做。隐式转换应该是安全的并且不要抛出。
来自C#语言规范,§6.1:
预定义的隐式转换始终成功,永远不会导致 要抛出的异常。正确设计的用户定义隐式 转换也应该表现出这些特征。
因此,如果您确实需要验证,请将其设为显式转换。
答案 1 :(得分:1)
按MSDN documentation并且出于隐式投射的目的,您的答案是否。
但是,因为隐式转换不需要程序员 明确地从一种类型转换为另一种类型,必须注意 防止意外结果。一般来说,隐式转换运算符 永远不应该抛出异常,永远不要丢失信息 可以在没有程序员意识的情况下安全使用。如果转换 运营商不能满足那些标准,应该明确标明
答案 2 :(得分:0)
B Tyler是对的,你正在尝试捕捉类型(按名称)的逻辑,而你可以轻松地使用lamdbas。它们将为您带来更多灵活性。
并且您的方法名称没有表达方法正在做什么 - 例如DivByZero
不是除以零而是i
...并且您的代码不会毫无例外地运行。我没有看到这一点。