Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/336.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
从一个用户定义类转换到另一个具有返回问题的类。(C#)_C#_Casting - Fatal编程技术网

从一个用户定义类转换到另一个具有返回问题的类。(C#)

从一个用户定义类转换到另一个具有返回问题的类。(C#),c#,casting,C#,Casting,我是C#的新手,这没有什么意义。 我正在将一个名为User的非常简单的类转换为另一个名为InputCapsule的相当简单的类。 我遇到的问题是返回输入胶囊的时间,VS表示如下 用户定义的转换必须转换为封闭类型或从封闭类型转换 我很困惑,因为我返回的是正确的类型。 我的参考代码: (如果名称、电子邮件和通行证发生变化,则它们是属性。) 使用System.Collections.Generic; 使用System.Linq; 使用系统文本; 使用System.Threading.Tasks; 名称

我是C#的新手,这没有什么意义。 我正在将一个名为User的非常简单的类转换为另一个名为InputCapsule的相当简单的类。 我遇到的问题是返回输入胶囊的时间,VS表示如下

用户定义的转换必须转换为封闭类型或从封闭类型转换

我很困惑,因为我返回的是正确的类型。 我的参考代码:

(如果名称、电子邮件和通行证发生变化,则它们是属性。)

使用System.Collections.Generic;
使用System.Linq;
使用系统文本;
使用System.Threading.Tasks;
名称空间你好
{
公共类输入胶囊
{
公共静态显式运算符InputCapsule(用户v)
{
InputCapsule@out=新的InputCapsule();
@out.输入.添加(v.名称);
@输出。输入。添加(v.电子邮件);
@输出.输入.添加(v.通过);
返回@out;
}
公开清单投入;
}
} 

转换运算符的源类型或目标类型必须与封闭类/结构的类型相同。这里,封闭类是
InputCapsule
。请注意,这是一种开放类型。目标类型为
InputCapsule
——一种封闭类型。C#对这些问题的处理非常不同,认为它们是不同的类型,尽管它们都是以
InputCapsule
开头的。看

为了证明它们确实是不同的类型,我可以声明从
InputCapsule
InputCapsule
的转换:

公共静态显式运算符InputCapsule(InputCapsule v)
{
返回null;
}
如果它们是同一类型,根据法律,这是不允许的

如果可以更改
User
,则应在
User
中声明转换。

此处用于“强制转换(当前类型)”(如果不存在此表达式,则不可以使用封闭构造的泛型类型作为显式运算符“名称”的泛型类型参数,因为方法定义用于开放类型(对不起,如果我没有用这些好话)

这里您不是在使用泛型“方法”,而是在定义它,因为它接受的参数类型不是
InputCapsule
(请参阅@Sweeper-answer,我将其称为“cast out(当前类型)”)

因此,这里的泛型类型参数
T
必须与
InputCapsule
中的类本身相同

因此,您可以接下来检查
T
是否是方法体中的字符串,以允许或禁止(抛出异常)强制转换,或者执行其他相关操作

例如,您可以编写:

public class InputCapsule<T>
{
  public static explicit operator InputCapsule<T>(User v)
  {
    if ( typeof(T) == typeof(string) )
    {
      InputCapsule<string> instance = new InputCapsule<string>();
      instance.inputs.Add(v.Name);
      instance.inputs.Add(v.Email);
      instance.inputs.Add(v.Pass);
      return (InputCapsule<T>)(object)instance;
    }
    else
      throw new InvalidCastException();
  }
  public List<T> inputs = new List<T>();
}

public class User
{
  public string Name;
  public string Email;
  public string Pass;
}
还使用新的开关模式匹配

试验


您的方法正在转换为
InputCapsule
而不是
InputCapsule
。封闭类型是
公共类InputCapsule
“我正在返回正确的类型”--不,您没有。错误消息准确地解释了代码的错误。
public static explicit operator InputCapsule<string>(InputCapsule<T> v)
{
    return null;
}
public class InputCapsule<T>
{
  public static explicit operator InputCapsule<T>(User v)
  {
    if ( typeof(T) == typeof(string) )
    {
      InputCapsule<string> instance = new InputCapsule<string>();
      instance.inputs.Add(v.Name);
      instance.inputs.Add(v.Email);
      instance.inputs.Add(v.Pass);
      return (InputCapsule<T>)(object)instance;
    }
    else
      throw new InvalidCastException();
  }
  public List<T> inputs = new List<T>();
}

public class User
{
  public string Name;
  public string Email;
  public string Pass;
}
if ( typeof(T) == typeof(string) )
{
}
else
if ( typeof(T) == typeof(int) )
{
}
else
if ( typeof(T) == typeof(MyClass) )
{
}
else
  throw new InvalidCastException();
  var user = new User { Name = "name", Email = "mail@mail.com", Pass = "pwd" };

  var inputcapsule = (InputCapsule<string>)user;

  Console.WriteLine(string.Join(Environment.NewLine, inputcapsule.inputs));