簡體   English   中英

泛型方法中的 C# 結構

[英]C# struct in generic method

我嘗試做這樣的事情:

class Program
    {
        public struct frst
        {
            public short Oversize_FrontInch;
            public short Oversize_RearInch;
            public short Oversize_RightInch;
            public short Oversize_LeftInch;
            public short HeightInch;
        }
        public struct sec
        {
            public short Oversize_FrontInch;
            public short Oversize_RearInch;
            public short Oversize_RightInch;
            public short Oversize_LeftInch;
        }
        public void DoSmth<T>() where T:struct
        { 
            T str = new T();
            str.Oversize_FrontInch = (short)2;

        }
    }

但我得到“t不包含...的定義”錯誤有沒有辦法做到這一點? 重要的事情:為了休息代碼,它必須是結構。

使用這些看似不相關的結構來了解更多您想要實現的目標會很棒,但這是一個編譯和運行並將secfrst保留為結構的版本:

DoSmth<sec>();
DoSmth<frst>();

void DoSmth<T>() where T: struct, IOversize
{ 
    T str = default;
    str.Oversize_FrontInch = (short)2;
    Console.WriteLine(str.GetType());
}


public interface IOversize 
{
    short Oversize_FrontInch {get; set;}
}

public struct sec: IOversize
{
    public short Oversize_FrontInch {get; set;}
}        

public struct frst: IOversize
{
    public short Oversize_FrontInch {get; set;}
    public short HeightInch {get; set;}
}

這打印:

sec
frst

我猜你想要這樣的東西。

結構不能繼承,所以你的代碼不能做你想做的事。

您可以改為使用基類並從中繼承數據類。

但請注意,您需要繼承默認構造函數才能在泛型函數中創建數據類。

這是一個簡單的示例供您使用,您可以根據需要對其進行編輯和潤色。

using System;

public class HelloWorld
{
    public class baseclass{
        public short Oversize_FrontInch;
        public short Oversize_RearInch;
        public short Oversize_RightInch;
        public short Oversize_LeftInch;
    }
    public class frst:baseclass
    {
        public short HeightInch;
    }
    public class sec:baseclass 
    { 
    }
    
    public static void DoSmth<T>() where T:baseclass, new()
    { 
        T str = new T();
        str.Oversize_FrontInch = (short)2;
        Console.WriteLine(str.Oversize_FrontInch);
    }
    
    public static void Main(string[] args)
    { 
        DoSmth<frst>();
    }
}

編輯:我看到有人建議使用帶有結構的接口。 有可能的。 但是,它將包裝您的所有價值,產生性能問題並創建不可讀的代碼。 我不會推薦它。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM