ser*_*0ne 1 .net c# implicit-conversion
我最近在.NET中编写了几个结构,然后我添加了隐式转换运算符
例:
public struct Alpha
{
internal string value;
public static implicit operator Alpha(Beta b)
{
return new Alpha() { value = b.value };
}
public static implicit operator Beta(Alpha a)
{
return new Beta() { value = a.value };
}
}
public struct Beta
{
internal string value;
public static implicit operator Alpha(Beta b)
{
return new Alpha() { value = b.value };
}
public static implicit operator Beta(Alpha a)
{
return new Beta() { value = a.value };
}
}
Run Code Online (Sandbox Code Playgroud)
测试:
Alpha a = default(Alpha);
Beta b = a;
// Ambiguous user defined conversions 'Alpha.implicit operator Beta(Alpha)' and 'Beta.implicit operator Beta(Alpha)' when converting from 'Alpha' to 'Beta'
Run Code Online (Sandbox Code Playgroud)
我想知道C#中隐式转换的规则/最佳实践是什么?
自我注意:我的直觉是类型不应该通过隐式转换返回另一种类型的对象?即Beta不应该Alpha通过隐式转换Beta返回Beta,反之亦然,应该返回,并且Alpha应该返回Alpha
示例(已修复):
public struct Alpha
{
internal string value;
public static implicit operator Alpha(Beta b)
{
return new Alpha() { value = b.value };
}
}
public struct Beta
{
internal string value;
public static implicit operator Beta(Alpha a)
{
return new Beta() { value = a.value };
}
}
Run Code Online (Sandbox Code Playgroud)
我的假设是否正确?
你Alpha(Beta x)在两个类中都有一个定义,因此应该使用哪一个是模糊的. 允许每个类只处理自身的转换. 换句话说,struct Alpha实现Alpha(Beta b)因为它最好知道如何创建自己的实例.另外,我会考虑实现显式转换而不是隐式转换.它有时可能会意外地导致错误或意外转换,并且在处理复杂类时通常会"有损"转换.
public struct Alpha
{
internal string value;
public static implicit operator Alpha(Beta b)
{
return new Alpha() { value = b.value };
}
}
public struct Beta
{
internal string value;
public static implicit operator Beta(Alpha a)
{
return new Beta() { value = a.value };
}
}
Run Code Online (Sandbox Code Playgroud)
你可能只在一个班级中实现"双向"的唯一一次,就是如果另一个班级不了解你的新班级. 当您希望支持从预先存在的类/结构转换(例如支持从框架类型转换)时,这是更常见的情况:
public struct Alpha
{
internal string value;
public static implicit operator Alpha(string b)
{
return new Alpha() { value = b };
}
public static implicit operator string(Alpha a)
{
return a.value;
}
}
Run Code Online (Sandbox Code Playgroud)