我有一个封装泛型类 T 的类,它有一个隐式运算符将封装类转换为 T。
但是,只有当我在调用代码中显式转换时才会使用该转换。 我还没有找到任何似乎适用的规则。 这是 .Net 8.0,C# 12。
internal class Program
{
static void Main(string[] args)
{
Console.WriteLine("Hello, World!");
var r = new Result<Contact>(new Contact() { FullName = "Otto" });
Console.WriteLine(r.Value.FullName); // This works, no surprise
Console.WriteLine(r.FullName); // Squiggly under FullName. CS1061: 'Result<Contact>' does not contain a definition for 'FullName' and no accessible extension method...
Console.WriteLine(((Contact)r).FullName); // Explicit cast works
}
}
public class Contact
{
public string FullName { get; set; } = "";
}
public class Result<T>
{
public T Value { get; }
public int Index { get; }
public Result(T value)
{
Value = value;
Index = 0;
}
public Result(T value, int index)
{
Value = value;
Index = index;
}
public static implicit operator T(Result<T> result)
{
return result.Value;
}
}
一个变量只能有一种类型。在你的情况下,
r
是Result<Contact>
。您不能将其同时用作 Result<Contact
和 Contact
来同时访问这两种类型的成员。
您所做的允许您在需要
r
的地方传递 Contact
,而无需显式转换。
var r = new Result<Contact>(new Contact() { FullName = "Otto" });
Console.WriteLine(r.Value.FullName); //Otto
// implicit cast works because the parameter is of type Contact
// which Result<Contact> impicitly converts to
Action<Contact> action = c => Console.WriteLine(c.FullName);
action(r); // Otto