如何在C#中获得一个不可为null的T,以便在函数中使用它?

如何在C#中获得一个不可为null的T,以便在函数中使用它?,c#,non-nullable,C#,Non Nullable,此代码中有一个错误 private void Save<T>(string file) where T : struct, IPixel<T> { Image<T> image = Image.LoadPixelData<T>( _image.Data, _image.Width, _image.Height); image.Save(file); }

此代码中有一个错误

    private void Save<T>(string file)
        where T : struct, IPixel<T>
    {
        Image<T> image = Image.LoadPixelData<T>(
            _image.Data, _image.Width, _image.Height);
        image.Save(file);
    }
private void保存(字符串文件)
其中T:struct,IPixel
{
Image=Image.LoadPixelData(
_image.Data、_image.Width、_image.Height);
图像保存(文件);
}
CS8377 C#类型“T”必须是不可为null的值类型,以及任何嵌套级别的所有字段,才能将其用作泛型类型或方法中的参数

Im使用C#7.3、.NETFramework 4.6和wpf 此代码适用于winforms

[编辑] 图像来自六位劳工

using SixLabors.ImageSharp;
using SixLabors.ImageSharp.PixelFormats;
using System;
using System.IO;

namespace DDSReader
{
public class LoadImage
{
    private readonly Pfim.IImage _image;

    public byte[] Data
    {
        get
        {
            if (_image != null)
                return _image.Data;
            else
                return new byte[0];
        }
    }

    public LoadImage(string file)
    {
        _image = Pfim.Pfim.FromFile(file);
        Process();
    }

    public LoadImage(Stream stream)
    {
        if (stream == null)
            throw new Exception("DDSImage ctor: Stream is null");

        _image = Pfim.Dds.Create(stream, new Pfim.PfimConfig());
        Process();
    }

    public LoadImage(byte[] data)
    {
        try
        {
            if (data == null || data.Length <= 0)
                throw new Exception("DDSImage ctor: no data");

            _image = Pfim.Dds.Create(data, new Pfim.PfimConfig());
            Process();
        }
        catch { }
    }

    public void Save(string file)
    {
        try
        {
            if (_image.Format == Pfim.ImageFormat.Rgba32)
                Save<Bgra32>(file);
            else if (_image.Format == Pfim.ImageFormat.Rgb24)
                Save<Bgr24>(file);
            else
                throw new Exception("Unsupported pixel format (" + _image.Format + ")");
        }
        catch { }
    }

    private void Process()
    {
        if (_image == null)
            throw new Exception("DDSImage image creation failed");

        if (_image.Compressed)
            _image.Decompress();
    }


    private void Save<T>(string file)
        where T : struct, IPixel<T>
    {
        Image<T> image = Image.LoadPixelData()

            Image.LoadPixelData<T>(
            _image.Data, _image.Width, _image.Height);
        image.Save(file);
    }

}
}
使用SixLabors.ImageSharp;
使用SixLabors.ImageSharp.PixelFormats;
使用制度;
使用System.IO;
名称空间读取器
{
公共类装入映像
{
私有只读Pfim.IImage\u图像;
公共字节[]数据
{
得到
{
如果(_image!=null)
返回_image.Data;
其他的
返回新字节[0];
}
}
公共加载映像(字符串文件)
{
_image=Pfim.Pfim.FromFile(文件);
过程();
}
公共加载映像(流)
{
if(流==null)
抛出新异常(“DDSImage-ctor:Stream为null”);
_image=Pfim.Dds.Create(stream,new Pfim.PfimConfig());
过程();
}
公共加载映像(字节[]数据)
{
尝试
{
如果(data==null | | data.Length尝试使用类型约束:

private void Save<T>(string file)
        where T : unmanaged, IPixel<T>
private void保存(字符串文件)
其中T:非托管,IPixel

似乎
Image
来自
SixLabors.ImageSharp
,您可以检查他们在页面上使用的约束。

错误到底在哪里?什么是
Image
?如果您可以提供一个解决方案,那么会更容易帮助您。当您遇到这样的问题时,请查看所用方法的文档ling并确保您的约束匹配。在这种情况下,TPixel:unmanaged,IPixel
可能是我更新到了Sixlabors的新版本,这种类型的代码不再工作了,谢谢help@Bj我很乐意帮忙!