Как преобразовать тип данных в аргумент метода из Struct? - PullRequest
0 голосов
/ 08 февраля 2019

проблема

Я создал struct , enum и method .Перечисление используется в структуре.В этом методе используется структура.

Когда я пытаюсь принять ввод от пользователя в основном, и вызвать метод , я получаю ошибку преобразования. Я не могу преобразовать структуру в двойную.

Как в этом случае преобразовать ввод от пользователя?

дополнительная информация

(Предполагается, что это должно конвертировать типы температур, сейчас я написал преобразование только для одной из температур, но для остальных (кроме формул) это то же самое)

PS: я не узнал о списках иинтерфейсы, и я не могу сделать это в другом классе.

public enum MyEnum {C,F,K}

public struct MyStruct
{
    public double foo;
    public MyEnum bar; 
}
class Program
{
    static void Main(string[] args)
    {
        Console.WriteLine("Make user put in a double followed by a space and one of the Enums");
        string input = Console.ReadLine();
        string[] parts = input.Split(' '); 

        MyStruct temp = new MyStruct (); 
        temp.foo= double.Parse(parts[0]);

        if(parts[1] == "C")
        {

            TheMethodIUSedForC(parts[0]);
            temp.bar= MyEnum.C;
        }
    }
    public MyStruct TheMethodIUSedForC(MyStruct t)
    {
        if (t.bar== MyEnum.F)
        {
            t.bar= MyEnum.F;
            t.foo = (t.foo* 1.8) + 32;
            return t;
        }
        else if (t.bar== MyEnum.K)
        {
            t.bar= MyEnum.K;
            t.foo= t.foo + 273.15;
            return t;
        }
        else
        {
            return t;
        }
    }

Ответы [ 2 ]

0 голосов
/ 08 февраля 2019

Я не знаю, правильно ли я понял ваш вопрос, но вы можете построить временную структуру и передать ее методу, подобному следующему:

public enum MyEnum {C,F,K}

public struct MyStruct
{
    public double foo;
    public MyEnum bar;
}
class Program
{
    static void Main(string[] args)
    {
        Console.WriteLine("Make user put in a double followed by a space and one of the Enums");
        string input = Console.ReadLine();
        string[] parts = input.Split(' ');

        MyStruct temp = new MyStruct();
        temp.foo = double.Parse(parts[0]);
        temp.bar = (MyEnum)Enum.Parse(typeof(MyEnum),parts[1]);
        MyMethod(temp);
    }
    public static MyStruct MyMethod(MyStruct t)
    {
        if (t.bar == MyEnum.F)
        {
            t.bar = MyEnum.F;
            t.foo = (t.foo * 1.8) + 32;
            return t;
        }
        else if (t.bar == MyEnum.K)
        {
            t.bar = MyEnum.K;
            t.foo = t.foo + 273.15;
            return t;
        }
        else
        {
            return t;
        }
    }
}

Таким образом, вам даже не нужнопереназначив переменную "bar" внутри "MyMethod", вы можете просто разработать переменную foo.

И, конечно, вам нужно правильно обработать случай, когда предоставленное письмо не может быть проанализировано как MyEnum.Для этого вы можете использовать Enum.TryParse (...)

0 голосов
/ 08 февраля 2019

Глядя на ваш код, пытаясь скомпилировать его, я не могу получить ошибку, которую вы получили.В моем случае ошибка не в double , а string , что является правильным, поскольку parts [0] является строкой.Ваш метод:

public MyStruct TheMethodIUSedForC(MyStruct t)

принимает MyStruct в качестве параметра, поэтому вы не можете передать parts [0] в качестве параметра, поскольку он имеет строковый тип.Он скомпилируется, если вы передадите, например. temp , который имеет тип MyStruct.Однако, вероятно, он не будет работать должным образом, поскольку поле bar еще не установлено.Измените:

if(parts[1] == "C")
{
    TheMethodIUSedForC(parts[0]);
    temp.bar= MyEnum.C;
}

на:

if(parts[1] == "C")
{
    temp.bar= MyEnum.C;
    TheMethodIUSedForC(temp);
}

, и это должно быть лучше.

...