不使用用户定义的隐式转换为泛型

问题描述 投票:0回答:1

我有一个封装泛型类 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;
    }
}

c# generics casting c#-12.0
1个回答
0
投票

一个变量只能有一种类型。在你的情况下,

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
© www.soinside.com 2019 - 2024. All rights reserved.